需要帮助编写更新查询以避免使用循环

时间:2019-03-29 17:18:53

标签: sql-server

我正在使用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中的循环。因此,我真的很希望能够通过查询执行此操作。我似乎只是想办法自己解决。

任何人和所有帮助将不胜感激。谢谢!

1 个答案:

答案 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