Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个外部联接的SQL求和_Sql - Fatal编程技术网

具有多个外部联接的SQL求和

具有多个外部联接的SQL求和,sql,Sql,我有表a、b、c和d,其中: There are 0 or more b rows for each a row There are 0 or more c rows for each a row There are 0 or more d rows for each a row 如果我尝试以下查询: SELECT a.id, SUM(b.debit), SUM(c.credit), SUM(d.other) FROM a LEFT JOIN b on a.id = b.a_id LEFT J

我有表a、b、c和d,其中:

There are 0 or more b rows for each a row
There are 0 or more c rows for each a row
There are 0 or more d rows for each a row
如果我尝试以下查询:

SELECT a.id, SUM(b.debit), SUM(c.credit), SUM(d.other)
FROM a
LEFT JOIN b on a.id = b.a_id
LEFT JOIN c on a.id = c.a_id
LEFT JOIN d on a.id = d.a_id
GROUP BY a.id
我注意到我已经创建了一个笛卡尔积,因此我的总和是不正确的,太大了

我看到还有其他的问题和答案,但是我仍然不知道如何在一个查询中完成我想做的事情。在SQL中是否可以编写一个聚合以下所有数据的查询:

SELECT a.id, SUM(b.debit)
FROM a
LEFT JOIN b on a.id = b.a_id
GROUP BY a.id

SELECT a.id, SUM(c.credit)
FROM a
LEFT JOIN c on a.id = c.a_id
GROUP BY a.id

SELECT a.id, SUM(d.other)
FROM a
LEFT JOIN d on a.id = d.a_id
GROUP BY a.id

在单个查询中?

也可以使用相关子查询完成:

SELECT a.ID, debit, credit, other
FROM a
LEFT JOIN (SELECT a_id, SUM(b.debit) as debit
           FROM b
          GROUP BY a_id) b  ON a.ID = b.a_id
LEFT JOIN (SELECT a_id, SUM(b.credit) as credit
           FROM c
          GROUP BY a_id) c  ON a.ID = c.a_id
LEFT JOIN (SELECT a_id, SUM(b.other) as other
           FROM d
          GROUP BY a_id) d  ON a.ID = d.a_id
SELECT a.id
     , (SELECT SUM(debit) FROM b WHERE a.id = b.a_id)
     , (SELECT SUM(credit) FROM c WHERE a.id = c.a_id)
     , (SELECT SUM(other) FROM d WHERE a.id = d.a_id)
 FROM a

也可以使用相关子查询完成:

SELECT a.id
     , (SELECT SUM(debit) FROM b WHERE a.id = b.a_id)
     , (SELECT SUM(credit) FROM c WHERE a.id = c.a_id)
     , (SELECT SUM(other) FROM d WHERE a.id = d.a_id)
 FROM a

你的分析是正确的。创建笛卡尔积

你必须分别求和,然后做最后的加法。这在一个查询中是可行的,您有几个选项:

选择中的子请求:选择a.id,从b中选择SUMb.debit,其中b.a_id=a.id+。。。 使用与第一个项目符号类似的查询交叉应用,然后选择a.id、b_sum+c_sum+d_sum 按照你的建议,用一个外部的和,再加上分组。 左键连接到类似的子查询,如上所述。
也许更多。。。不同解决方案的性能可能略有不同,具体取决于您要选择的行数。

您的分析是正确的。创建笛卡尔积

你必须分别求和,然后做最后的加法。这在一个查询中是可行的,您有几个选项:

选择中的子请求:选择a.id,从b中选择SUMb.debit,其中b.a_id=a.id+。。。 使用与第一个项目符号类似的查询交叉应用,然后选择a.id、b_sum+c_sum+d_sum 按照你的建议,用一个外部的和,再加上分组。 左键连接到类似的子查询,如上所述。
也许更多。。。不同解决方案的性能可能会略有不同,具体取决于您要选择的行数。

哦,等等,我想我可以合并三个子查询,并使用外部查询进行分组……您使用的是什么rdbms?我使用的是MS SQL Server。哦,等等,我想我可以合并三个子查询,并使用外部查询进行分组……您使用的是什么rdbms?我使用的是MS SQL Server。谢谢。我怀疑是这样,但我使用的专有库对最基本的子查询的支持也很有限。谢谢。我怀疑是这样,但我使用的专有库对最基本的子查询的支持也很有限。