SQL Server - 使用内部查询自联接更新值的代码

Posted

技术标签:

【中文标题】SQL Server - 使用内部查询自联接更新值的代码【英文标题】:SQL Server - Code for Updating values using inner query self join 【发布时间】: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 但迷路了。 我认为它不应该太复杂,但我可能想多了。

谢谢!

【问题讨论】:

【参考方案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

【讨论】:

以上是关于SQL Server - 使用内部查询自联接更新值的代码的主要内容,如果未能解决你的问题,请参考以下文章

替代多个SQL自联接来转换表

自联接的困难 MySQL 更新查询

了解在 SQL 查询的自联接中使用“Between”条件时的逻辑查询处理

使用自联接进行更新

自联接、子查询或其他?

LINQ 查询中的自联接并返回视图