具有复杂连接的sql查询

时间:2011-02-24 17:11:58

标签: sql oracle join

我有三张桌子:

  • 第一个列有三列(ID,Category,StartDate,EndDate)
  • 第二个也有相同的三列(ID,Category,StartDate,EndDate)
  • 第三个列有三列(Key,Category1,Category2)

我创建了一个sql脚本,如果第二个表中的一行在给定类别的第一个表中定义的时间段内(其中table1.ID = table2.ID和table1.category = table2.category),则返回1

我现在要做的是创建一个SQL脚本,检查第二个表中的行是否在给定类别和id的第一个表中定义的时间段内,或者是否在ID1_StartDate定义的时间段内和ID2_EndDate(其中ID1和ID2是连续的,意味着它们具有相同的类别,如果我们按日期升序排序,则此类别id2在id1之后)如果table3中存在这两种类别的关系。

1 个答案:

答案 0 :(得分:2)

如果满足以下任一条件,则以下查询将返回table1 ID:

1)表1描述的日期范围与table2中的日期范围完全相交

2)表1描述的日期范围与以table2中一行的开始日期开始并以table2中具有相同类别的下一个时间顺序行的enddate结束的日期范围相交。

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

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