2011-02-24 149 views
2

我有三个表:复杂SQL查询加入

  • 第一个三列(ID,类别,起始日期,结束日期)
  • 第二个也具有相同的三列(ID,类别,起始日期,结束日期)
  • 第三个三列

我已创建SQL脚本,返回1,如果从所述第二表中的一行是在限定的时间内(密钥,组别,类别2)给定ca的第一张表tegory(其中table1.ID = table2.ID和table1.category = table2.category)。

我想什么现在要做的是创建检查SQL脚本如果从第二个表中的一行是第一个表中定义为给定的分类和ID的期限内,或者是在有效期内的定义ID1_StartDate和ID2_EndDate(如果ID1和ID2是连续的,意味着它们具有相同的类别,并且如果我们按日期升序排列,则此类别id2在id1之后),如果这两个类别在表格3中存在这样的关系。

+3

它总是会有助于表明Oracle版本并表现出一定的数据行,并从该数据预期输出 – RichardTheKiwi 2011-02-24 17:18:28

+1

真的需要一些标点符号... – 2011-02-24 17:19:57

回答

2

下面的查询将返回table1的ID,如果这两个条件都为真:

1)由表1中所描述的时间范围相交于所有的时间范围在表2

2)的时间表1所描述的范围与从表2中的行的开始日期开始的日期范围相交,并且在具有相同类别的表2中的下一个时间顺序行的结束日期处结束。

select distinct table1.id 
from table1 
inner join (select id, 
        category, 
        startdate, 
        enddate, 
        lead(enddate) 
         over (partition by category 
           order by enddate) as next_enddate 
      from table2) 
on (table1.startdate < table2.enddate 
    or table1.startdate < table2.next_enddate) 
    and table1.enddate >= table2.startdate 
    and table1.ID = table2.ID 
    and table1.category = table2.category 

我不完全理解在这种情况下使用第三张表,所以暂时忽略它。希望这会让你更接近你正在寻找的答案。

+0

由于的JOIN,不能有重复的记录TABLE1如果有不止一个TABLE2/3条相关记录。 – 2011-02-24 18:06:18

+0

@OMG Ponies:好点,但是如果OP只是检查存在,就像他在他的例子中一样(在这种情况下只需检索第一行就足够了)。无论如何,我已经添加了'distinct'来纠正这个问题。 – Allan 2011-02-24 20:48:19

+0

+1:GROUP BY也可以 – 2011-02-24 20:57:54