如何仅删除SQL Server中表的顶行?
我做了:
set rowcount 1;
delete * from table;
set rowcount 0;
但我不确定这是否是一个很好的方法。
有没有更好的方法来实现这一目标?
答案 0 :(得分:6)
更新:哎呀! @gbn是对的,我的ORDER BY样本被打破了!使用正确的代码示例进行更新。
在最常见的情况下,“top”基于特定列或列中的值的顺序,您可以使用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] 指定的数量或百分比 将被删除的随机行。 表达式可以是数字也可以是 行的百分比。行 在使用的TOP表达式中引用 INSERT,UPDATE或DELETE不是 按任何顺序排列。
括号中的分隔符表达式 INSERT,UPDATE中需要TOP, 和DELETE语句。更多 信息,请参阅TOP (Transact-SQL).
答案 1 :(得分:4)
没有ORDER BY
使用WITH TIES处理联合顶部
您不能直接在DELETE中使用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;
答案 2 :(得分:0)
这种方法的问题在于它将随机删除一个行,您需要更具体(例如使用order by子句)以确保删除所需内容。更好的是 - 添加一个where子句,其中包含您想要删除的行的主键,并完全删除“rowcount”子句。
答案 3 :(得分: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访问sql.i测试的工作...只有一个第一个原始删除...
只有第一行会被删除