[英]How do I UPDATE TOP 5, using a subselect?
我驚訝地發現以下更新了34行...而不是5行:
UPDATE
Message
SET StatusRawCode = 25
WHERE StatusRawCode in
(
Select TOP 5
M2.StatusRawCode
From Message as M2
Where M2.StatusRawCode = 5
)
關於如何將其打造成正確形狀的任何想法?
謝謝!
我的猜測是從您的子查詢返回的StatusRawCode值是在更新的34條記錄中使用的值。 代替
WHERE StatusRawCode IN
用這個:
UPDATE
Message
SET StatusRawCode = 25
WHERE PrimaryKey in
(
Select TOP 5
PrimaryKey
From Message as M2
Where M2.StatusRawCode = 5
)
實質上,您將在子查詢中選擇要更新的5行的主鍵。 請記住,這將根據表的聚簇索引順序僅更新前5條記錄。 如果需要為TOP 5記錄指定特定條件,則需要添加order by子句。
例如,如果有一個名為Rank的列要用作條件,請按如下方式編寫查詢:
UPDATE
Message
SET
StatusRawCode = 25
WHERE
PrimaryKey IN
(
SELECT TOP 5
PrimaryKey
FROM
Message as M2
WHERE
M2.StatusRawCode = 5
ORDER BY
Rank DESC
)
這將根據Rank列值為您提供前5個記錄。 您可以根據需要替換列。
有沒有辦法明確識別TOP 5行?
根據您的查詢,如果您執行TOP 5並不重要(因為您選擇StatusRawCode = 5的記錄)。 所以,在某種程度上你的查詢是相同的
UPDATE
Message
SET StatusRawCode = 25
WHERE StatusRawCode = 5
似乎StatusRawCode
遠非唯一。 您想要撤回主鍵或其他唯一列以識別前五個。 您正在更新StatusRawCode
等於5的任何行。顯然,有34行符合該條件。
此外, top 5
只表示任何帶有order by
子句的東西。 SQL Server不以任何特定順序存儲行,並且不保證每次都返回相同的五行。 SQL Server以8k頁為單位存儲行,並且不保證也不為行集提供一致的順序。 您不能依賴於此,您必須使用order by
來確保您獲得正確的五行。 否則,您將更新五個隨機行 。
您需要將IN條件放在唯一的主鍵上。
在SQL 2K5和轉發中,您還可以使用CTE:
WITH cte AS (
Select TOP 5
M2.StatusRawCode
From Message as M2
Where M2.StatusRawCode = 5
ORDER BY ...
)
UPDATE cte
SET StatusRawCode = 25
我想介入並建議您始終使用SELECT語句啟動UPDATE語句。 像這樣:
SELECT *
--UPDATE m SET StatusRawCode = 25
FROM Message m
WHERE StatusRawCode in (
Select TOP 5
M2.StatusRawCode
From Message as M2
Where M2.StatusRawCode = 5
);
...但是一旦你能看到你出錯的地方(在這種情況下,可能與KG的回應類似),肯定會根據你的實際要求修改你的查詢
這將顯示將受您的查詢影響的行...所以一旦你有了正確的,更改UPDATE行的SELECT *(當前已注釋),你應該得到可預測的結果。
但請記住,UPDATE不支持ORDER BY,所以如果你最終嘗試UPDATE TOP(5)...,那么你將無法得到你想要的結果。
搶
如果您沒有主鍵且CTE不可用,則以下內容也適用:
UPDATE M
SET StatusRawCode = 25
FROM (Select TOP 5
M2.StatusRawCode
FROM Message as M2
WHERE M2.StatusRawCode = 5
ORDER BY ...) M
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.