我创建了两个临时表。一个包含物品和数量的订单,另一个包含可用性,我们也有物品和数量。我想编写一个多更新查询,其中包含来自库存的子跟踪订单数量,以及来自订单的临时表中所有文章的子更新查询。据我所知,在一个更新查询中不可能改变来自不同表的两个字段。
我尝试过这样的事情,但它当然没有用。
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)
答案 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
但是如果更新在两个或更多表中执行,我们必须创建视图然后我们可以更新
感谢