我正在尝试创建一个同步销售表和库存表的脚本。为此,我在库存表(每个库存项目有 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 无法绑定(bind)。
有没有办法在不使用游标的情况下更新N条库存记录(等于销售数量)?我拒绝就这样放弃。
注意:这是实际查询的简化版本。
最佳答案
您可以使用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;
关于sql-server - 有没有办法使用内连接更新 TOP (N),其中 N 是此类内连接的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54599430/