• 在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;
  • 相关阅读:
    DRF之url注册器组件
    序列化组件的使用及接口设计和优化
    Django 内置字段
    Django 的 ModelForm组件
    Django组件 中间件
    csrf
    django使用redis做缓存
    微信消息推送
    自定制serilazry字段
    小知识,大智慧(restframework 拾忆)
  • 原文地址:https://www.cnblogs.com/CreateMyself/p/9022515.html
Copyright © 2020-2023  润新知