2009-10-28 2 views
1

Я выполняю sql-запросы в oracle 10g.Объединение 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

ответ

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; 

Я не пробовал, так что не знаю, если синтаксис является правильным и будет ли он будет будет ужасно искажать данные. :)

EDIT: ИЗМЕНИТЬ UNION UNION ALL. Спасибо, APC!

РЕДАКТИРОВАТЬ 2: Указывать столбцы явно по рекомендации Тони.

+2

Это, по сути, правильная идея, за исключением того, что вы должны использовать UNION ALL, а не UNION. Если один и тот же REG_ID просто появляется в двух таблицах с тем же значением для BALANCE, его следует пересчитать дважды, UNION фильтрует дубликаты. – APC

+2

+1 Но синтаксис «select *» будет работать, только если все 3 таблицы имеют одинаковые столбцы; «select reg_id, balance» будет более безопасным. –

+0

+1 Хороший ответ! Короткие и эффективные! – Christian13467

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) 
Смежные вопросы