具有复杂连接的sql查询

Posted

技术标签:

【中文标题】具有复杂连接的sql查询【英文标题】:sql query with complicated join 【发布时间】:2011-02-24 17:11:58 【问题描述】:

我有三张桌子:

第一个有三列(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 中存在这种关系。

【问题讨论】:

指示 Oracle 版本并显示一些数据行和该数据的预期输出总是有帮助的 真的需要一些标点符号... 【参考方案1】:

如果以下任一条件为真,则以下查询将返回 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

我不完全理解第三张表在这个场景中的使用,所以暂时忽略。希望这仍然能让您更接近您正在寻找的答案。

【讨论】:

因为JOIN,如果相关的TABLE2/3记录多于一条,TABLE1记录可能重复。 @OMG Ponies:好点子,但如果 OP 只是检查存在,这可能无关紧要,就像他在他的示例中那样(在这种情况下,只需检索第一行就足够了)。我已经添加了distinct 以解决任何情况下的问题。

以上是关于具有复杂连接的sql查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询中表的复杂连接

连接两个表的复杂 SQL 查询

SQL 查询时间复杂度 - 连接与子查询

SQL之复杂查询与视图

如何重写具有连接子查询的 SQL 查询

SQL之复杂查询与视图