簡體   English   中英

如何使用subselect更新TOP 5?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM