SQL Update包含另一个表的结果

时间:2013-02-20 14:38:29

标签: sql sql-server

我想使用以下查询更新表产品的qty字段。 此查询在Qty字段中返回所需的数字。

SELECT e.Prod_name, e.Prod_number,
  (SUM(e.Qty) - SUM(g.Qty)) Qty
FROM Products_Invoices e JOIN (
    SELECT product_number, SUM(qty) Qty
    FROM SoldItemsCalc
    GROUP BY product_number
  ) g ON e.Prod_number = g.product_number
GROUP BY Prod_number, Prod_name
order by Prod_name

如何使用此查询并更新product_number匹配的值

我不介意你改变查询...只需要更新数值

谢谢

2 个答案:

答案 0 :(得分:2)

我是这样做的:

with toupdate as (
    SELECT e.Prod_name, e.Prod_number, (SUM(e.Qty) - SUM(g.Qty)) Qty
    FROM Products_Invoices e JOIN (
         SELECT product_number, SUM(qty) Qty
         FROM SoldItemsCalc
         GROUP BY product_number
        ) g ON e.Prod_number = g.product_number
    GROUP BY Prod_number, Prod_name
   )
update t
    set qty = toupdate.qty
    from toupdate
    where t.prod_nubmer = toupdate.prod_number

答案 1 :(得分:1)

你确定你的数量正在产生你想要的结果吗?您在子查询中执行SUM,然后在外部查询中执行另一个SUM。这可能会弄乱你的数字。这是@Gordon的一个很好的答案 - 这是使用我想你想要的数量来更新Product表:

with toupdate as (
    SELECT e.Prod_name, e.Prod_number, (SUM(e.Qty) - g.Qty) Qty
    FROM Products_Invoices e JOIN (
         SELECT product_number, SUM(qty) Qty
         FROM SoldItemsCalc
         GROUP BY product_number
        ) g ON e.Prod_number = g.product_number
    GROUP BY Prod_number, Prod_name, g.Qty
   )
update p
    set qty = t.qty
    from products p join toupdate t on p.prod_number = t.prod_number;

以下是小提琴的例子:http://www.sqlfiddle.com/#!3/42c80/1

Product_Invoices表中有2条记录,其中SUM为150.而SoldItemsCalc表中的2条记录总和为25.使用您的查询,当我想要您想要125时,整体结果会更改为100.

BTW - 使用上面的CTE将适用于SQL Server 2005及更高版本。如果您需要支持SQL Server 2000,请使用此版本:

update p
    set qty = t.qty
    from products p join (
      SELECT e.Prod_name, e.Prod_number, (SUM(e.Qty) - g.Qty) Qty
      FROM Products_Invoices e JOIN (
         SELECT product_number, SUM(qty) Qty
         FROM SoldItemsCalc
         GROUP BY product_number
        ) g ON e.Prod_number = g.product_number
    GROUP BY Prod_number, Prod_name, g.Qty) t on p.prod_number = t.prod_number;