如何只刪除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