有没有一种方法可以使用内部联接更新TOP(N),其中N是此类内部联接的字段?

时间:2019-02-08 20:03:37

标签: sql-server sql-update

我正在尝试创建一个同步Sales和Inventory表的脚本。为此,我在库存表上写了一个UPDATE(每个存货项有1条记录),如下所示:

     ...
   Set<String> tags = new HashSet<String>();
   while (resultset.next()) {
     tags.add(resultset.getString("Tag"));

但是它不起作用,错误提示q.QuantitySold无法绑定。

有没有一种方法可以在不使用游标的情况下更新N个库存记录(等于已售出的数量)?我拒绝那样放弃。

注意:这是实际查询的简化版本。

1 个答案:

答案 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;