Нужна помощь в написании запроса на обновление, чтобы избежать использования цикла - PullRequest
0 голосов
/ 29 марта 2019

Я использую Microsoft SQL Server 2014. У меня есть две таблицы.Один для номеров заказов (Заказы) и один для промежуточных мест размещения заказов (StagingLocations).

Заказы

----------------------
| OrderNumber | Zone |
----------------------
| 1           | 1    |
| 2           | 1    |
| 3           | 1    |
| 4           | 1    |
| 5           | 1    |
| 6           | 1    |
| 7           | 1    |
----------------------

И

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

Мне нужно обновить таблицу StagingLocations с номерами заказов из таблицы Orders.Что-то вроде этого:

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

Для достижения этой цели:

---------------------------------
| Zone | Location | OrderNumber |
---------------------------------
| 1    | A        | 1           |
| 1    | B        | 2           |
| 1    | C        | 3           |
| 1    | D        | 4           |
| 1    | E        | 5           |
| 2    | A        | NULL        |
| 2    | B        | NULL        |
| 2    | C        | NULL        |
| 2    | D        | NULL        |
| 2    | E        | NULL        |
---------------------------------

Но при использовании этого запроса я получаю один номер заказа во всех местах с соответствующимзона вместо каждого номера заказа в своем собственном местоположении.

Я знаю, что могу достичь желаемых результатов с помощью цикла.Но я читал, что я должен стараться избегать циклов в SQL.Поэтому я бы очень хотел иметь возможность сделать это с помощью запроса.Я просто не могу придумать способ сделать это самостоятельно.

Любая и вся помощь будет оценена.Спасибо!

1 Ответ

0 голосов
/ 29 марта 2019

Вам просто нужен еще один столбец, чтобы соответствовать таблицам 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...