前言
今天在導入數據到系統后需要根據時間排序對剛導入的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;