前言
今天在导入数据到系统后需要根据时间排序对刚导入的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;