如何使用select SQL语句(Oracle DBMS)生成两个数据集的“合并”?

时间:2010-06-02 23:06:44

标签: oracle insert sql

从两个表合并数据的插入SQL语句是什么。例如,我有events_source_1表(columns:event_type_id,event_date)和events_source_2表(相同列)和events_target表(列:event_type_id,past_event_date nullalbe,future_event_date可以为空)。

Events_source_1包含过去的事件,Events_source_2包含将来的事件,结果events_target将包含同一event_type_id的同一行中的过去和将来事件。如果没有past_events但是future_events则不会设置past_event_date,只会设置future_event_date,反之亦然。

非常感谢您提前帮助我解决这个问题。

3 个答案:

答案 0 :(得分:3)

罗马,你需要在你的选择上做一个完整的外连接,以便对于任何给定的事件类型id(我假设你的过去和未来的表中任何特定事件类型都有0或1行id),您将输出一行,以及相应的null和非null日期。

第一个答案不会将两个来源的日期合并为一行,这就是我相信你要求的。

第二个答案更接近,但仅适用于具有过去和未来日期的行(即:每个表中有一个),因为内部联接。

示例:

insert into event_target (event_type_id, past_event_date, future_event_date)
select nvl(p.event_type_id, f.event_type_id), p.event_date, f.event_date
from
events_source_1 p full outer join
events_source_2 f on p.event_type_id = f.event_type_id

请注意,nvl函数适用于Oracle,并将使用它看到的第一个非null。 ISNULL可用于SQL Server。

答案 1 :(得分:2)

INSERT INTO events_target
(
SELECT event_type_id, 
       NULL as past_event_date, 
       event_date as future_event_date 
  FROM Events_source_2
UNION
SELECT event_type_id, 
       event_date as past_event_date, 
       NULL as future_event_date 
  FROM Events_source_1
)

只要event_type_id在Events_source_1和Events_source_2

之间是唯一的

答案 2 :(得分:1)

也许是这样的:(不是100%肯定语法)

insert into event_target (event_type_id, past_event_date, future_event_date)
select
    p.event_type_id as event_type_id,
    p.event_date as past_event_date,
    f.event_date as future_event_date
from events_source_1 p
inner join events_source_2 f on p.event_type_id = f.event_type_id