2009-12-28 211 views
0

我有三個表,tableA(id,A),tableB(id,B)和tableC(id,C)。 ID是唯一的和主鍵。現在我想對這三個表執行一個查詢,以找出每個id的A,B和C值的總和。 (即,如果ID 1存在於表A但不TableB中然後值B應該被認爲是0的id 1)。實施例:表A:SQL查詢找出三個不同表中的一些字段

id A 
1 5 
2 6 
3 2 
5 7 

tableB的:

id B 
2 5 
3 8 
4 1 

表C:

id C 
5 2 

輸出應爲:

id Sum 
1 (5 + 0 + 0 =)5 
2 (6 + 5 + 0 =)11 
3 (2 + 8 + 0 =)10 
4 (0 + 1 + 0 =)1 
5 (7 + 0 + 2 =)9 
+0

建議你改變問題的標題爲「SQL查詢,找出三個總和來自三個不同表格的字段「。 – 2009-12-28 10:48:26

回答

1

首先得到ID的清單(UNION),以便包含全部內容,然後使用LEFT JOIN將這些值相加。

喜歡的東西

SELECT IDs.ID, 
     IFNULL(tableA.A,0) + IFNULL(tableB.B,0) + IFNULL(tableC.C,0) SumVal 
FROM (
      SELECT ID 
      FROM tableA 
      UNION 
      SELECT ID 
      FROM tableB 
      UNION 
      SELECT ID 
      FROM tableC 
     ) IDs LEFT JOIN 
     tableA ON IDs.ID = tableA.ID LEFT JOIN 
     tableB ON IDs.ID = tableB.ID LEFT JOIN 
     tableC ON IDs.ID = tableC.ID 
+0

沒有downvoting,但這是不是比其他答案複雜? – ChristopheD 2009-12-28 10:38:33

1

像這樣的東西應該工作:

select id, sum(val) from 
(select id, "A" as val from "tableA" 
    union all 
    select id, "B" as val from "tableB" 
    union all 
    select id, "C" as val from "tableC") as joined 
group by id 
order by id 
+0

我不認爲「A」/「tableA」/「B」/「tableB」/「C」/「tableC」應該用引號引起來。它們不是文字文字。 – 2009-12-28 10:46:05

+0

那麼,如果你使用postgresql(我選擇的數據庫),那麼包含它們是一個很好的習慣,儘管只有當你需要列名或表名時,它們纔是PG或2中的保留關鍵字(更常見)在表或列名稱中使用下劃線等字符。 – ChristopheD 2009-12-28 10:49:53

+0

這非常快。謝謝 :) – bhups 2009-12-28 10:54:50

1

我不能與MySQL測試,但該作品在我的數據庫(HSQLDB,甲骨文):

select ID, sum(X) from 
    (SELECT ID, A as X FROM tableA 
    UNION 
    SELECT ID, B as X FROM tableB 
    UNION 
    SELECT ID, C as X FROM tableC) 
group by ID 
1

不確定MySQL的確切語法,但在SQL Server中有效:

SELECT ID, SUM(ColToSum) As SumValue FROM 
(
SELECT ID, A As ColToSum FROM TableA 
UNION ALL 
SELECT ID, B As ColToSum FROM TableB 
UNION ALL 
SELECT ID, C As ColToSum FROM TableC 
) Combined 
GROUP BY ID 

記住使用「UNION ALL」,而不僅僅是「聯盟」,這剔除了重複的行,因爲它結合(見http://dev.mysql.com/doc/refman/5.0/en/union.html

相關問題