Есть ли способ ОБНОВИТЬ TOP (N) с внутренним соединением, где N - поле такого внутреннего соединения? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь создать скрипт, который синхронизирует таблицы продаж и инвентаризации.Для этого я написал ОБНОВЛЕНИЕ в таблице инвентаризации (в которой имеется 1 запись на элемент инвентаря):

UPDATE TOP (q.QuantitySold) i
SET i.Converted = 1,
    i.CartID = q.CartID,
    i.ReservedDate = GETDATE()
FROM Inventory i
INNER JOIN
(
    SELECT product.ProductID, sales.CartID, COUNT(sales.ID) AS QuantitySold
    FROM Products product
    INNER JOIN Sales sales ON sales.ProductID = product.ProductID
    WHERE <conditions> 
    GROUP BY product.ProductID, sales.CartID
) q ON q.ProductID = i.ProductID
WHERE i.Converted = 0 AND i.CartID IS NULL 

Но это не работает, ошибка говорит, что q.QuantitySold не может быть привязан.

Есть ли способ обновить N записей инвентаря (равных проданному количеству) без использования курсора?Я отказываюсь так сдаваться.

Примечание: это упрощенная версия фактического запроса.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете использовать ROW_NUMBER для перечисления предметов инвентаря, которые необходимо обновить.

WITH cteProducts AS(
    SELECT product.ProductID, sales.CartID, COUNT(sales.ID) AS QuantitySold
    FROM Products product
    INNER JOIN Sales sales ON sales.ProductID = product.ProductID
    WHERE <conditions> 
    GROUP BY product.ProductID, sales.CartID
),
cteInventory AS(
    SELECT *,
        ROW_NUMBER() OVER( PARTITION BY ProductID ORDER BY (SELECT NULL)) AS rn /*Change the ORDER BY for an actual column if needed, probably for FIFO*/
    FROM Inventory
    WHERE i.Converted = 0 
    AND i.CartID IS NULL 
)
UPDATE i
SET i.Converted = 1,
    i.CartID = q.CartID,
    i.ReservedDate = GETDATE()
FROM cteInventory i
INNER JOIN cteProducts q ON q.ProductID = i.ProductID
WHERE i.rn <= q.QuantitySold;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...