我正在尝试创建一个同步Sales和Inventory表的脚本。为此,我在库存表上写了一个UPDATE(每个存货项有1条记录),如下所示:
...
Set<String> tags = new HashSet<String>();
while (resultset.next()) {
tags.add(resultset.getString("Tag"));
但是它不起作用,错误提示q.QuantitySold无法绑定。
有没有一种方法可以在不使用游标的情况下更新N个库存记录(等于已售出的数量)?我拒绝那样放弃。
注意:这是实际查询的简化版本。
答案 0 :(得分:2)
您可以使用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;