2009-10-28 127 views
1

我正在oracle 10g中執行sql查詢。加入3個結構相似的表

我想將3個表連接到一個包含3個單獨表中所有記錄的新表中。餘額應該彙總在3個表格之間reg_id重複的地方,這樣每個reg_id只有一個條目,並且在我的新表格中總計餘額。

樣本數據(類似的表格,具有不同的值)。表格:temp1,temp2,temp3

reg_id |   balance 
-------------------------------- 
92603013    183.77 
92611902    419.46 
92766121    77.04 
93527720    24.84 
93581368    120.09 
93684684    89.88 
93527720    113.66 

欣賞如果有人能幫助我的語法。

+0

難道還有一個表中同一REG_ID值?會不會有一些reg_ids存在於一張表中,而另一張沒有? – Rahul 2009-10-28 05:21:42

回答

4

請嘗試以下...

INSERT INTO target_table (reg_id, balance) 
SELECT reg_id, sum(balance) as balance 
FROM (select reg_id, balance from temp1 
     UNION ALL 
     select reg_id, balance from temp2 
     UNION ALL 
     select reg_id, balance from temp3) 
GROUP BY reg_id; 

我還沒有嘗試過所以不知道如果語法是正確的,它是否會會可怕裂傷您的數據。 :)

編輯:將聯盟更改爲聯盟所有。謝謝,APC!

編輯2:根據Tony的建議明確指定列。

+2

這基本上是正確的想法,除非你應該使用UNION ALL而不是UNION。如果相同的REG_ID恰好出現在兩個具有相同BALANCE值的表中,則應計算兩次,UNION會過濾掉重複項。 – APC 2009-10-28 05:32:46

+2

+1但是,如果所有3個表具有相同的列,則「select *」語法纔有效; 「select reg_id,balance」會更安全。 – 2009-10-28 10:26:26

+0

+1好答案!簡短而高效! – Christian13467 2009-10-29 14:33:46

1

我建議:

SELECT coalesce(t1.reg_id, t2.reg_id, t3.reg_id) AS the_reg_id, 
     coalesce(t1.balance, 0.0) + 
     coalesce(t2.balance, 0.0) + 
     coalesce(t3.balance, 0.0) AS the_balance 
FROM t1 FULL OUTER JOIN t2 ON (t1.reg_id = t2.reg_id) 
     FULL OUTER JOIN t3 ON (t1.reg_id = t3.reg_id)