2014-01-18 106 views
0

我有两个表具有以下数据:选择SQL内部连接和省略某些记录

表A

ID  DESC 
1  One 
2  Two 
3  Three 

ID是主键

表B显示了我在做对ID的动作表阿

NO  ACTION  ID  DATETIME 
1  ADD   1  2012-01-01 00:00:00 
2  ADD   2  2012-01-01 00:00:00 
3  ADD   3  2012-01-01 00:00:00 
4  DELETE  2  2012-01-01 01:00:00 
5  EDIT   1  2012-01-01 02:00:00 
6  EDIT   3  2012-01-01 03:00:00 
7  DELETE  1  2012-01-01 03:00:00 
8  REVIVE  2  2012-01-01 04:00:00 
9  EDIT   2  2012-01-01 05:00:00 

NO是主键

这里是总结:

ID 1:添加于2012-01-01 00:00:00,编辑于2012-01-01 02:00:00,删除于2012-01-01 03: 00:00

ID 2:2012-01-01 00:00:00 ADD,2012-01-01 01:00:00 DELETE,2012-01-01 04:00:00 REVIVE,编辑2012-01-01 05:00:00

ID 3:2012-01-01 00:00:00,编辑ADD 2012-01-01 03:00:00

我如何查询表得到如下结果:

表C

NO  DESC 
2  Two 
3  Three 

我想要做的是:查询表A中没有在最后交易时间删除操作,所以我只得到有效ID

我试图做内部联接,但如何在最后一次交易时忽略具有删除操作的ID。任何建议/意见将不胜感激。

+0

是'NO'主键?它是否符合'DATETIME'? –

+0

@KubaWyrostek表主键是ID列,表B主键是NO列(用于事务索引)。这意味着表B将始终处于DATETIME顺序。顺便说一句我正在使用postgres – wrez

回答

1

你可以试试这个

select ID, DESC 
from A join (
select id, action, rank() over (partition by id order by datetime desc) ranking 
from B 
) B on (B.ranking = 1 and B.id = A.id and B.action <> 'DELETE') 
0

假设比NO是的TableB主键,下令根据DATETIME

select 
    TableA.ID, TableA.DESC 
from TableA inner join 
    (select ID, max(NO) as MaxNO from TableB group by ID) as MaxNOs 
    on TableA.ID = MaxNOs.ID 
     inner join TableB on MaxNOs.ID = TableB.ID and MaxNOs.MaxNO = TableB.NO 
where 
    TableB.ACTION <> 'DELETE'