2010-06-03 19 views
0

這是我原來的問題: merging two data sets如何創建將從兩個表(Oracle DBMS)生成「合併」數據集的選擇SQL語句?

不幸的是我省略了一些intircacies,我想在這裏闡述。

所以我有兩個表events_source_1和events_source_2表。我必須從這些表中生成數據集到結果數據集(我可以插入到第三個表中,但這是無關緊要的)。

events_source_1包含歷史事件數據,我所要做的得到最新的事件(這樣我做了以下內容:

select event_type,b,c,max(event_date),null next_event_date 
from events_source_1 
group by event_type,b,c,event_date,null 

events_source_2遏制,未來事件數據,我必須做到以下幾點:

select event_type,b,c,null event_date, next_event_date 
from events_source_2 
where b>sysdate; 

如何把外部聯接語句來填補這一空白(即當同一EVENT_TYPE,b,C從event_source_2然後next_event_date將充滿了第一次約會的發現發現

非常感謝您的幫助。

回答

0

我最終做兩個步驟的過程:第1步從填充事件表1的數據,第二步驟合併目標(從第一步驟的數據集)和另一個源極之間的數據。請原諒我,但出於法律原因,我不得不混淆表名並在下面的代碼中省略一些列。這裏的SQL:

INSERT INTO EVENTS_TARGET (VEHICLE_ID,EVENT_TYPE_ID,CLIENT_ID,EVENT_DATE,CREATED_DATE) 
select VEHICLE_ID, EVENT_TYPE_ID, DEALER_ID, 
max(EVENT_INITIATED_DATE) EVENT_DATE, sysdate CREATED_DATE 
FROM events_source_1 
GROUP BY VEHICLE_ID, EVENT_TYPE_ID, DEALER_ID, sysdate; 

這裏的第二個步驟:

MERGE INTO EVENTS_TARGET tgt 
USING (
    SELECT ee.VEHICLE_ID VEHICLE_ID, ee.POTENTIAL_EVENT_TYPE_ID POTENTIAL_EVENT_TYPE_ID, ee.CLIENT_ID CLIENT_ID,ee.POTENTIAL_EVENT_DATE POTENTIAL_EVENT_DATE FROM EVENTS_SOURCE_2 ee WHERE ee.POTENTIAL_EVENT_DATE>SYSDATE) src 
ON (tgt.vehicle_id = src.VEHICLE_ID AND tgt.client_id=src.client_id AND tgt.EVENT_TYPE_ID=src.POTENTIAL_EVENT_TYPE_ID) 
WHEN MATCHED THEN 
UPDATE SET tgt.NEXT_EVENT_DATE=src.POTENTIAL_EVENT_DATE 
WHEN NOT MATCHED THEN 
insert (tgt.VEHICLE_ID,tgt.EVENT_TYPE_ID,tgt.CLIENT_ID,tgt.NEXT_EVENT_DATE,tgt.CREATED_DATE) VALUES (src.VEHICLE_ID, src.POTENTIAL_EVENT_TYPE_ID, src.CLIENT_ID, src.POTENTIAL_EVENT_DATE, SYSDATE) 
; 
2

希望我的問題得到了解決。這應返回event_type, b, c的最新event_dateevents_source_1,並添加event_source_2的最低event_date

Select es1.event_type, es1.b, es1.c, 
     Max(es1.event_date), 
     Min(es2.event_date) As next_event_date 
From events_source_1 es1 
Left Join events_source_2 es2 On ( es2.event_type = es1.event_type 
            And es2.b = es1.b 
            And es2.c = es1.c 
           ) 
Group By c1.event_type, c1.b, c1.c 
1

你可以只讓表中,你需要使用一組由成一個虛擬表中選擇一個最大值,然後做充分的正如我在上一個問題的答案中提供的那樣。

添加像這樣到查詢的頂部:

with past_source as (
select event_type, b, c, max(event_date)
from event_source_1
group by event_type, b, c, event_date
)

然後你可以使用past_source就好像它是一個實際的表,然後繼續你的選擇權收盤上的括號,子句之後所示。

+0

非常好的評論!非常感謝這個珍聞 – 2010-06-07 22:19:56