Я работаю над простым проектом инвентаризации с 2 таблицами: товары и транзакции.
Я построил цикл while, который получает наибольший Item_ID, связанный с Transaction_ID, из таблицы транзакций, обновляет SubLocation_ID элемента в таблице Items, используя предоставленную переменную SubLocation_ID, а затем получает следующий наибольший Item_ID, пока больше нет связанных с идентификатором Transaction_ID.
SELECT TOP 1 @Current_Item_ID = Item_ID
FROM Transactions
WHERE Transaction_ID = @Transaction_ID
ORDER BY Item_ID
WHILE @Current_Item_ID IS NOT NULL
BEGIN
UPDATE Items
SET SubLocation_ID = @SubLocation_ID
WHERE Item_ID = @Current_Item_ID
SELECT TOP 1 @Current_Item_ID = Item_ID
FROM Transactions
WHERE Transaction_ID = @Transaction_ID AND Item_ID > @Current_Item_ID
ORDER BY Item_ID
IF @@ROWCOUNT = 0
BREAK
END
Вот как я бы подходил к проблеме на «обычном» языке программирования, но я чувствую, что это неправильный способ сделать это в SQL. Каждая итерация цикла должна выполнять отдельные операции обновления и выбора, но правильное объединение может сделать все, по сути, за одну операцию.
Как получить один оператор объединения для замены всего этого блока кода?