#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