如何只删除SQL Server中的表的第一行?仅删除顶部行。 SQL Server
我所做的:
set rowcount 1;
delete * from table;
set rowcount 0;
但我不知道,如果它是一个很好的办法做到这一点。
有没有更好的方法来实现它?
如何只删除SQL Server中的表的第一行?仅删除顶部行。 SQL Server
我所做的:
set rowcount 1;
delete * from table;
set rowcount 0;
但我不知道,如果它是一个很好的办法做到这一点。
有没有更好的方法来实现它?
更新:哎呀! @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
TOP(表达)[PERCENT] 指定将被删除 随机的行数或百分比。表达式可以是数字或 百分比的行。在带有INSERT,UPDATE或DELETE的TOP表达式中使用的 中引用的行 不是按照任何顺序排列的 。
在INSERT,UPDATE, 和DELETE语句中需要使用括号来限定 TOP中的表达式。欲了解更多 信息,请参阅TOP (Transact-SQL).
这种方法的问题是,它会随机删除一个行,你需要更具体的(如使用ORDER BY子句),以确保您删除你想要的。更好的是 - 为你真正想删除的行添加一个where子句和主键,然后完全删除“rowcount”子句。
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;
+1对于比我的更短(并且更正确!)的答案,并且提示WITH TIES。 – 2010-02-26 15:55:25
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工作...只有一个第一胎删除...
仅第一行会被删除
我不认为你的答案是SQL。看起来更像VB给我。 – JoriO 2014-10-14 06:51:33
我想你没有尝试这样的:它不工作 – gbn 2010-02-26 05:54:22
doh!我首先测试了无序版本,然后我6个月大的孩子开始哭泣,在完成ORDER BY变体测试之前,我被要求离开宝宝。 :-)意味着昨天晚上回到它,但直到现在还没有回来。感谢您的支持。 – 2010-02-26 15:54:02