【问题标题】:SQL Server - Code for Updating values using inner query self joinSQL Server - 使用内部查询自联接更新值的代码
【发布时间】:2020-01-30 15:24:51
【问题描述】:

这对大多数人来说可能是相当基本的,但我想获得一些帮助。

使用 SQL Server 我有以下订单表(Excel 摘录以简化):

请注意有多个订单 (OrderID)。有些可能具有“PrimaryOrder”值,这意味着它们与现有的先前订单相关。相关订单收到第一个相关订单的“PrimaryOrder”,以及一个“OrderIndex”,指出它们进入的订单。 只有每组中的第一个订单具有价值。如果一个订单的“PrimaryOrder”为NULL,这意味着它是一个订单,我应该忽略它。

我需要的是,使用 SQL Server 更新命令为所有相关订单提供与其第一个相关订单的“价值”相同的“价值”。 对于具有“OrderIndex”> 1 的每个订单的含义,将其 Value 字段从 NULL 更新为其“PrimaryOrder”值。 如果 "PrimaryOrder" = 1 OR 为 NULL,则忽略且不更新。

尝试了一些简单的 INNER JOIN 但迷路了。 我认为它不应该太复杂,但我可能想多了。

谢谢!

【问题讨论】:

    标签: sql sql-server sql-update


    【解决方案1】:

    您可以将 correlated 子查询与 update 语句一起使用:

    update o
         set o.value = (select top (1) o1.value
                        from Orders o1 
                        where o1.primaryorder = o.primaryorder and 
                              o1.value is not null and
                              o1.orderindex <= o.orderindex
                        order by o1.orderindex desc
                       )
    from Orders o
    where o.value is null;
    

    【讨论】:

      【解决方案2】:

      大概是这样的:

      UPDATE #table
      SET a.Value=b.Value
      FROM #table a INNER JOIN #table b 
              on a.OrderID=b.PrimaryOrder and a.OrderIndex>1 and a.Value is NULL
      

      【讨论】:

        【解决方案3】:
        UPDATE o
        SET Value=MaxVals.MaxValue
        FROM Orders o
        INNER JOIN (
            SELECT MAX(Value) AS MaxValue, PrimaryOrder
            FROM Orders
            WHERE PrimaryOrder IS NOT NULL
            GROUP BY PrimaryOrder
        ) AS MaxVals ON MaxVals.PrimaryOrder=o.PrimaryOrder
        WHERE o.Value IS NULL
        

        【讨论】:

          【解决方案4】:

          谢谢大家。 设法从上述所有内容中获取一些东西,这解决了它:

          UPDATE O
              SET O.[Value] = B.[Value]
          FROM Orders O INNER JOIN Orders B
          ON O.PrimaryOrder = B.[PrimaryOrder] and O.OrderIndex > 1 and O.[Value] is NULL
          AND B.[OrderIndex] = 1
          

          【讨论】:

            猜你喜欢
            • 2015-08-01
            • 2013-11-03
            • 2013-07-28
            • 2011-03-28
            • 2012-12-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-21
            相关资源
            最近更新 更多