2017-03-01 24 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