zoukankan      html  css  js  c++  java
  • 在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;
  • 相关阅读:
    小白重装系统步骤总结
    【bzoj3680】平衡点 模拟退火
    【洛谷P4513】小白逛公园
    【POJ3666】Making the Grade 离散化+DP
    【codevs1690】开关灯 线段树
    【POJ2182】Lost Cows 树状数组+二分
    【POJ2676】sudoku 搜索
    【UVA】11400 照明系统设计 排序+dp
    关于二分答案输出误差问题的看法
    Java programming language does not use call by reference for objects!
  • 原文地址:https://www.cnblogs.com/CreateMyself/p/9022515.html
Copyright © 2011-2022 走看看