多次更新查询

时间:2015-12-14 14:23:44

标签: sql sql-server tsql

我创建了两个临时表。一个包含物品和数量的订单,另一个包含可用性,我们也有物品和数量。我想编写一个多更新查询,其中包含来自库存的子跟踪订单数量,以及来自订单的临时表中所有文章的子更新查询。据我所知,在一个更新查询中不可能改变来自不同表的两个字段。

我尝试过这样的事情,但它当然没有用。

UPDATE  #Stocks as s
  INNER JOIN #Orders as o on o.ArticleId=s.ArticleId
SET 
   s.Quantity = (s.Quantity - o.Quanity)

FROM
    #Stocks s
   JOIN #Orders o on o.ArticleId=s.ArticleId
WHERE
   #Stocks.ArticleId IN (SELECT ArticleId FROM #Orders)

4 个答案:

答案 0 :(得分:3)

使用update多个匹配的join时,update只选择了一个任意行。关键的想法是在更新之前聚合数据

UPDATE s
    SET Quantity = (s.Quantity - o.Quanity)
    FROM #Stocks s JOIN
         (SELECT o.ArticleId, SUM(o.Quantity) as quantity
          FROM #Orders o
          GROUP BY o.ArticleId
         ) o
         ON o.ArticleId = s.ArticleId;

您的语句过于复杂,混合了来自SQL Server,MySQL和Postgres的update语法。此外,WHERE子句是不必要的,因为JOIN执行过滤。但是,即使语法错误得到修复,您仍然会遇到计算错误结果的问题,除非您预先聚合数据。

不幸的是,此行为的描述深埋在update页面上第一个示例的documentation中:

  

上一个示例假设只记录了一次销售   指定的销售人员在特定日期,并且更新是最新的。   如果可以记录指定销售人员的多个销售   同一天,显示的示例无法正常工作。这个例子   运行没有错误,但每个SalesYTD值只更新一个   销售,无论当天实际发生了多少销售。 :此   是因为单个UPDATE语句永远不会更新同一行   时间。 [强调补充]

答案 1 :(得分:1)

这个怎么样?

UPDATE s  
   SET s.Quantity = (s.Quantity - o.Quanity)  
  FROM #Stocks as s  
  INNER JOIN #Orders as o on o.ArticleId=s.ArticleId  

答案 2 :(得分:1)

要使用单个查询更新两个表,您应该创建一个包含两个表列的视图,然后更新该视图。

答案 3 :(得分:0)

您的问题是关于多重更新, 但是更新在一个表中基于另一个表执行 要执行此操作,请使用join

但是如果更新在两个或更多表中执行,我们必须创建视图然后我们可以更新

感谢