我必须检索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;
答案 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;