2017-03-01 27 views
0

我想加入三個表,我想要獲取裝運ID,其中表2中的時間(裝運的日期和時間)應該小於表3。 CHANGE_DATE的格式爲在oracle中檢查兩個時間戳sql

select shipment_id from table1 
left join table2 on table1.shipment_id=table2.shipment_id 
left join table3 on table2.shipment_id=table3.shipment_id and table2.Code=table3.Code 
where table2.change_date<table3.change_date 

數據按下面

表1

shipment_id 
123456 

表2

shipment_id--------------Change_Date-------------------------Code 
123456------19-JAN-17 09.54.07.000000 AM----------------32 
123456------19-JAN-17 10.54.07.000000 PM----------------51 

表3

shipment_id--------------Change_Date-------------------------Code 
123456------19-JAN-17 12.54.07.000000 PM----------------32 
123456------19-JAN-17 07.54.07.000000 AM----------------32 
123456------20-JAN-17 09.54.10.000000 AM----------------32 

所以我需要的輸出作爲

shipemnt_id-------------Change_Date 
123456--------19-JAN-17 12.54.07.000000 PM 
123456--------20-JAN-17 09.54.10.000000 AM 

請幫助

回答

0

如果我正確理解你的要求,你要保留給定的貨物記錄Table3其變動日期更大比最同一批貨物的最近更改日期出現在Table2。如果是這樣,那麼我們可以創建一個子查詢,它標識Table2中的每個貨件的最新更改日期,然後使用該查詢從Table3中刪除我們不希望出現在我們的結果集中的記錄。

SELECT t1.shipment_id, 
     t3.change_date 
FROM table1 t1 
LEFT JOIN Table3 t3 
    ON t1.shipment_id = t3.shipment_id 
INNER JOIN 
(
    SELECT shipment_id, MAX(change_date) AS max_change_date 
    FROM table2 
    GROUP BY shipment_id 
) t2 
    ON t3.shipment_id = t2.shipment_id AND 
     t3.change_date > t2.max_change_date