2014-04-24 38 views
0

我有表A,B,c和d,其中:SQL求和加入

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 

在單個查詢中?

+0

哦,等等,我想我可以聯合三個子查詢,並與外部查詢分組... – Daniel

+0

你使用的是什麼rdbms? –

+0

我正在使用MS SQL Server。 – Daniel

回答

1
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 
1

還可以與相關子查詢做到:

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 
+0

謝謝。我懷疑是這種情況,但我使用的專有庫對即使是最基本的子查詢也提供了有限的支持。 – Daniel

2

你的分析是正確的。無關JOIN創建笛卡爾產品。

你必須單獨完成這筆款項,然後做最後的補充。這是一個查詢可行的,你有幾個選項:然後SELECT a.id, b_sum + c_sum + d_sum

  • UNION ALL爲您推薦SELECT a.id, (SELECT SUM(b.debit) FROM b WHERE b.a_id = a.id) + ...
  • CROSS APPLY有類似查詢作爲第一彈:

    • 子請求在你的SELECT最重要的是外層SUMGROUP BY
    • LEFT JOIN與以上類似的子查詢。

    而且可能更多...各種解決方案的性能可能會略有不同,具體取決於您想要選擇的A中有多少行。