从两个表合并数据的插入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,反之亦然。
非常感谢您提前帮助我解决这个问题。
答案 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