具有复杂连接的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查询的主要内容,如果未能解决你的问题,请参考以下文章