在结果集日期之间从另一个表中选择记录

时间:2014-10-22 19:04:35

标签: oracle

我有一个像这样的结果集(我必须执行一个查询才能从合约表中获取它):

OBJECT_ID     START_DT     END_DT

1             01/01/2011   12/31/2011
2             08/08/2008   09/30/2013
3             10/01/2008   10/31/2013
..
..

指定某些对象在合同上处于活动状态的日期。

我还有另一张桌子(称之为OBJ_EVENTS),如下所示:

OBJECT_ID     EVENT_DATE     EVENT_TYPE

1             10/10/2010     FOO EVENT
1             01/05/2011     BAR EVENT
1             01/01/2012     FOO EVENT
2             08/09/2008     FOO EVENT
4             10/10/2010     BAZ EVENT

该表告诉我某个对象何时做了我可能感兴趣的事情。但是,我只关心合同日期START_DTEND_DT之间的事件,用于我的合同结果集中的对象。所以,如果这是我的整个OBJ_EVENTS表,我想要的结果集如下所示:

OBJECT_ID     EVENT_DATE     EVENT_TYPE

1             01/05/2011     BAR EVENT --between Obj 1's contract dates 01/01/2011-12/31/2011
2             08/09/2008     FOO EVENT --between Obj 2's contract dates 08/08/2008-09/30/2013 

是否可以在一个SQL查询中完成此操作,还是需要执行某种游标?我没有大量的SQL经验。

1 个答案:

答案 0 :(得分:2)

您可以使用您正在使用的查询来获取第一个结果集作为子查询,例如:

select oe.OBJECT_ID, oe.EVENT_DATE, oe.EVENT_TYPE
from OBJ_EVENTS oe inner join
( *result set query here*) rs
on oe.OBJECT_ID = rs.OBJECT_ID and
  oe.EVENT_DATE between rs.START_DT and rs.END_DT;

这可能不是最好的方式,但它应该完成工作。特别是,如果您的结果集不经常更改,则可能值得在常规表中缓存该查询的结果。无论是否经常更改,如果经常引用结果集,为它创建视图会很有用。