仅删除顶行。 SQL Server

时间:2010-02-26 00:45:08

标签: sql sql-server

如何仅删除SQL Server中表的顶行?

我做了:

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

但我不确定这是否是一个很好的方法。

有没有更好的方法来实现这一目标?

4 个答案:

答案 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

引用DELETE docs on MSDN

  

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

     

括号中的分隔符表达式   INSERT,UPDATE中需要TOP,   和DELETE语句。更多   信息,请参阅TOP (Transact-SQL).

答案 1 :(得分:4)

  • 没有ORDER BY

  • ,TOP无意义
  • 使用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测试的工作...只有一个第一个原始删除...

只有第一行会被删除