Использование цикла while для перебора строк таблицы и обновления значения в другой таблице.Как я могу сделать это с помощью соединения? - PullRequest
1 голос
/ 06 марта 2019

Я работаю над простым проектом инвентаризации с 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. Каждая итерация цикла должна выполнять отдельные операции обновления и выбора, но правильное объединение может сделать все, по сути, за одну операцию.

Как получить один оператор объединения для замены всего этого блока кода?

1 Ответ

3 голосов
/ 06 марта 2019

Вы можете использовать следующий запрос для обновления через Join

UPDATE   I
 SET    I.SubLocation_ID = @SubLocation_ID
FROM Items I 
JOIN Transactions T
    ON I.Item_ID = T.Item_ID
WHERE      T.Transaction_ID = @Transaction_ID 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...