在SQL Server中如何進行UPDATE TOP .....ORDER BY?


前言

今天在導入數據到系統后需要根據時間排序對剛導入的TOP N條進行數據更新,之前沒遇到過UPDATE TOP...ORDER BY,以此作為備忘錄。

SQL SERVER之UPDATE TOP...ORDER BY

我們利用AdventureWorks2012實例數據庫來演示,一般情況我們如下一次性更新所有數據,如下:

SELECT * FROM Production.Product

UPDATE Production.Product SET ListPrice = 1

如上我們一次性將表Production.Product中的列ListPrice更新為1,結果如下:

但是我們項目實際需求是因為之前數據庫已存在對應企業下數據,當前我們導入的數據需要更新一列作為標識區分,如下:

SELECT TOP 10.* FROM  Production.Product
WHERE SafetyStockLevel = 1000
ORDER BY SellStartDate DESC

大意如上,將導入的數據根據SellStartDate日期倒序,並根據條件篩選剛導入的數據10條,接下來這是對其進行更新。

UPDATE TOP(10) Production.Product  SET ListPrice = 1 
WHERE SafetyStockLevel = 1000
ORDER BY SellStartDate DESC

到現在我才知道UPDATE不能和ORDER BY一起使用,漲知識了,又學到了一點。接下來則是解決UPDATE TOP...ORDER BY的問題。我想到了方案是根據CTE更新,如下:

;WITH Product AS
(
  SELECT TOP 10.* FROM  Production.Product
  WHERE SafetyStockLevel = 1000
  ORDER BY SellStartDate DESC
)
UPDATE Product SET ListPrice = 1

這是解決方案中的其中之一,我們也可以如下這樣做:

UPDATE Production.Product SET ListPrice = 1
WHERE ProductID IN(
    SELECT TOP 10 ProductID FROM  Production.Product
    WHERE SafetyStockLevel = 1000
    ORDER BY SellStartDate DESC)

或者可以如下這樣做:

UPDATE Production.Product
  SET ListPrice = updateValue 
 FROM (SELECT TOP 10 ProductID, 1 AS updateValue 
         FROM Production.Product  
        ORDER BY SellEndDate DESC
      ) AS t1 
WHERE  Production.Product.ProductID = t1.ProductID;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM