2009-10-28 133 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)