2010-02-26 24 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