2010-02-26 74 views
2

如何只删除SQL Server中的表的第一行?仅删除顶部行。 SQL Server

我所做的:

set rowcount 1; 
delete * from table; 
set rowcount 0; 

但我不知道,如果它是一个很好的办法做到这一点。

有没有更好的方法来实现它?

回答

6

更新:哎呀! @gbn是正确的,我的ORDER BY示例被破坏了!使用正确的代码示例更新。

在“顶”是基于特定的列或列中的值的顺序,最常见的情况,你可以使用一个CTE和ROW_NUMBER模拟有序TOP:

WITH cte AS 
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY SomeColumn, OtherColumn) AS RowNum 
    FROM table 
) 
DELETE FROM cte 
WHERE RowNum <= 1; 

Itzik Ben-Gan's SQLMag article on TOP有关此建议模式的更多信息。

如果你只是想删除一组重复的任何行,或者只是想删除随机行出于某种原因,然后就可以安全地忽略ORDER BY,做一些简单的:

DELETE TOP (1) FROM table

DELETE docs on MSDN引用:

TOP(表达)[PERCENT] 指定将被删除 随机的行数或百分比。表达式可以是数字或 百分比的行。在带有INSERT,UPDATE或DELETE的TOP表达式中使用的 中引用的行 不是按照任何顺序排列的 。

在INSERT,UPDATE, 和DELETE语句中需要使用括号来限定 TOP中的表达式。欲了解更多 信息,请参阅TOP (Transact-SQL).

+0

我想你没有尝试这样的:它不工作 – gbn 2010-02-26 05:54:22

+0

doh!我首先测试了无序版本,然后我6个月大的孩子开始哭泣,在完成ORDER BY变体测试之前,我被要求离开宝宝。 :-)意味着昨天晚上回到它,但直到现在还没有回来。感谢您的支持。 – 2010-02-26 15:54:02

0

这种方法的问题是,它会随机删除一个行,你需要更具体的(如使用ORDER BY子句),以确保您删除你想要的。更好的是 - 为你真正想删除的行添加一个where子句和主键,然后完全删除“rowcount”子句。

4
  • TOP是毫无意义的ORDER BY

  • WITH TIES用来对付共同顶部

  • 你不能在使用ORDER BY直接删除,所以你必须要解决它

像这样:

DELETE foo 
FROM (SELECT TOP 1 /*WITH TIES*/ * FROM Mytable ORDER BY WhatDecidesTop) foo; 

;WITH Foo AS 
(
    SELECT TOP 1 /*WITH TIES*/ * FROM Mytable ORDER BY WhatDecidesTop 
) 
DELETE foo; 
+0

+1对于比我的更短(并且更正确!)的答案,并且提示WITH TIES。 – 2010-02-26 15:55:25

0
Dim mySqlCommondDelete As String = "DELETE BOOK_ID,MemberID FROM (SELECT TOP 1 * FROM ISSUE_BOOK) where BOOK_ID = Val(" & deleteBook & ") and MemberID = Val(" & msk & ")" 

这是测试的MS Access sql.i工作...只有一个第一胎删除...

仅第一行会被删除

+1

我不认为你的答案是SQL。看起来更像VB给我。 – JoriO 2014-10-14 06:51:33