Нужна помощь в написании запроса на обновление, чтобы избежать использования цикла

#sql-server

#sql-server

Вопрос:

Я использую Microsoft SQL Server 2014. У меня есть две таблицы. Один для номеров заказов (Orders) и один для промежуточных местоположений для заказов (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. Не ясно, чего вы хотите. Итак, что не так с выводом вашего запроса? Выходные данные соответствуют вашему запросу. Опубликуйте ожидаемый результат.

2. Опубликованный мной результат не соответствует опубликованному мной запросу. Вывод — это результат, который я хочу. Запрос — это моя неудачная попытка получить эти результаты.

Ответ №1:

Вам просто нужен другой столбец для соответствия таблицам 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