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 - 使用内部查询自联接更新值的代码的主要内容,如果未能解决你的问题,请参考以下文章