我正在使用Microsoft SQL Server2014。我有两个表。一个用于订单号(订单),另一个用于订单的暂存位置(StagingLocations)。
订单
print()
和
StagingLocations
----------------------
| OrderNumber | Zone |
----------------------
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 1 |
| 7 | 1 |
----------------------
我需要使用Orders表中的订单号更新StagingLocations表。基本上是这样的:
---------------------------------
| Zone | Location | OrderNumber |
---------------------------------
| 1 | A | NULL |
| 1 | B | NULL |
| 1 | C | NULL |
| 1 | D | NULL |
| 1 | E | NULL |
| 2 | A | NULL |
| 2 | B | NULL |
| 2 | C | NULL |
| 2 | D | NULL |
| 2 | E | NULL |
---------------------------------
要实现这一目标:
UPDATE
StagingLocations s
SET
s.OrderNumber = o.OrderNumber
FROM
StagingLocation s INNER JOIN
Orders o ON s.Zone = o.Zone
WHERE
o.OrderNumber IS NULL
但是,当使用该查询时,我最终得到的是在具有匹配区域的所有位置上都有一个订单号,而不是在其自己位置上的每个订单号。
我知道我可以通过循环实现想要的结果。但是我读过我应该尽量避免SQL中的循环。因此,我真的很希望能够通过查询执行此操作。我似乎只是想办法自己解决。
任何人和所有帮助将不胜感激。谢谢!
答案 0 :(得分:0)
您只需要另一列以匹配表Orders和StagingLocations。在这种情况下,我们将使用ROW_NUMBER
。
update sl
set OrderNumber=oc.OrderNumber
from StagingLocations sl
join (
select Zone,Location, row_number() over (partition by Zone order by Zone, location) i
from StagingLocations
) slc on sl.Zone=slc.Zone and sl.Location=slc.Location
join (
select OrderNumber, Zone, ROW_NUMBER() over (partition by Zone order by Zone, OrderNumber) i
from orders
) oc on slc.Zone=oc.Zone and slc.i=oc.i
where sl.OrderNumber is null