需要检索表A中的所有记录,并且只检索表B中最后一次更新的记录

时间:2015-05-01 14:00:16

标签: sql oracle select greatest-n-per-group

我必须检索TABLE_A中的某些记录 - 然后需要显示行的最后一次更新 - 这是在TABLE_B中(但是,有许多记录在TABLE_B中相关)。 TABLE_A的TABLE_A.PK是ID,并指向TABLE_B到TABLE_B.LINK的链接,其中模式为:

TABLE_A
===================
ID          NUMBER
DESC        VARCHAR2

TABLE_B
===================
ID          NUMBER
LINK        NUMBER
LAST_DATE   DATE

实际的表格数据是:

TABLE_A
===================
100         DESCRIPTION0
101         DESCRIPTION1

TABLE_B
===================
1     100   12/12/2012
2     100   12/13/2012
3     100   12/14/2013
4     101   12/12/2012
5     101   12/13/2012
6     101   12/14/2013

所以,我需要读一些东西:

Result
====================
100   DESCRIPTION0    12/14/2013
101   DESCRIPTION1    12/14/2013

我尝试以不同的方式加入,但似乎没有任何效果:

select * from
(SELECT ID, DESC from TABLE_A WHERE ID >= 100) TBL_A
full outer join
(select LAST_DATE from TABLE_B WHERE ROWNUM = 1 order by LAST_DATE DESC) TBL_B
on TBL_A.ID = TBL_B.LINK;

2 个答案:

答案 0 :(得分:1)

最简单的方法是在table_a上加入table_b汇总查询:

SELECT    table_a.*, table_b.last_date
FROM      table_a
LEFT JOIN (SELECT   link, MAX(last_date) AS last_date
           FROM     table_b
           GROUP BY link) table_b ON table_a.id = table_b.link

答案 1 :(得分:1)

如果您只想要最近的日期,请考虑聚合和加入。额外级别的子查询没有帮助。类似的东西:

select a.id, a.desc, max(last_date)
from table_a a join
     table_b b
     on a.id = b.link
where a.id >= 100
group by a.id, a.desc;

注意:我怀疑full outer join是否必要,但如果你有表之间不匹配的连接键,你可以保留它。也许left join是合适的。

我应该指出,如果您想要b中的更多字段,那么您最初使用row_number()的倾向是正确的。但查询看起来像:

select a.id, a.desc, max(last_date)
from table_a a left join
     (select b.*, row_number() over (partition by link order by last_date desc) as seqnum
      from table_b b
     ) b
     on a.id = b.link and b.seqnum = 1
where a.id >= 100
group by a.id, a.desc;