来自多个表的SQL Server查询和

来自多个表的SQL Server查询和,sql,sql-server,Sql,Sql Server,我遇到了一个我无法解决的问题不幸的是 我有两个表:采购订单行和销售订单行。 现在,我需要从单个订单中提取信息,还需要从销售订单行和采购订单行中提取该订单上列出的特定项目的案例总数。比如我订购了10张桌子,我想知道我已经订购了20张桌子,我有25张桌子的销售订单。下面是我的问题 选择s.POLID、s.ItemID、s.CSordered、, SUMsl.CSopen为CSopenSO,SUMpl.CSopen为CSopenPO 从采购订单行s s.ItemID=sl.ItemID上的左连接Sal

我遇到了一个我无法解决的问题不幸的是

我有两个表:采购订单行和销售订单行。 现在,我需要从单个订单中提取信息,还需要从销售订单行和采购订单行中提取该订单上列出的特定项目的案例总数。比如我订购了10张桌子,我想知道我已经订购了20张桌子,我有25张桌子的销售订单。下面是我的问题

选择s.POLID、s.ItemID、s.CSordered、, SUMsl.CSopen为CSopenSO,SUMpl.CSopen为CSopenPO 从采购订单行s s.ItemID=sl.ItemID上的左连接SalesOrdersLines sl s.ItemID=pl.ItemID上的左连接PurchaseOrdersLines pl 其中s.POID='$行['POID']。' 按s.POLID、s.ItemID、s.CSordered分组 我得到的CSopenSO的总和是正确的,但不是CSopenPO的总和,它是它应该的50倍。如果我先左键连接采购订单pl,然后是销售订单sl,那么我得到的是正确的CSopenPO之和,而不是CSopenSO之和。我不明白左连接的顺序如何影响和以及如何避免它

提前感谢您的帮助!!! 如果事情清楚的话,我希望

***Jarlh建议

选择s.POLID、s.ItemID、s.CSordered、, 从SalesOrdersLines sl中选择SumcOpen,其中sl.ItemID=s.ItemID 作为CSopenSO,SUMpl.CSopen作为CSopenPO 从采购订单行s s.ItemID=pl.ItemID上的左连接PurchaseOrdersLines pl 其中s.POID='$行['POID']。' 按s.POLID、s.ItemID、s.CSordered分组
然而,我仍然想理解为什么我上面的原始查询没有按照我希望的方式工作。我想知道错误是什么。

通常,相关子查询是最有效的方法:

SELECT s.POLID, s.ItemID, s.CSordered,
       (SELECT SUM(sl.CSopen)
        FROM SalesOrdersLines sl 
        WHERE s.ItemID = sl.ItemID
       )  AS CSopenSO,
       (SELECT SUM(pl.CSopen)
        FROM PurchaseOrdersLines pl 
        WHERE s.ItemID = pl.ItemID
       ) AS CSopenPO 
FROM PurchaseOrdersLines s
WHERE s.POID = '" . $row['POID'] . "';

这假设s中的行没有合并。

JOIN和groupby combined需要特别小心。在加入查询之前,请尝试在子查询中按分组。或者,如果您懒惰,请跳过联接和分组方式,而将相关子查询放在选择列表中。谢谢Jarlh的建议,我将其中一个联接移动到了选择列表中的子查询中,效果很好。然而,我仍然想理解为什么我的原始查询没有按照我希望的方式工作。我想知道错误是什么。错误在您的连接逻辑中。删除summing并添加各个表的pk和fk列,然后可能将resultset限制为单个项,以查看联接的实际工作方式。不过,谢谢您,Gordon。。有没有办法不用子查询就能做到这一点?@MaxCB。您可以使用CTE进行预聚合。但是没有,如果没有某种子查询,真的没有办法做到这一点。