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

服务器

浏览数:321

2019-5-12

前言

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

作者:Jeffcky