我需要查找表1中未从table2引用的特定日期范围的记录 - 也就是T1中某些日期范围内没有引用的T1元素集。
在我看来,这是两个子查询的左连接的组合。
逻辑:
查询1:AllT1Records:返回T1的所有记录
查询2:AllT1RefsInDateRange:特定日期范围内T2对T2的所有引用
查询3:从AllT1RefsInDateRange中不存在的AllT1Records返回那些记录
这让我成为了那里的一部分,但是返回T1中的所有记录而T2中没有引用:
select T1.name, T2.rackName, T2.allocationStart
From T1
LEFT JOIN
T2 on T1.name = T2.rackName
where T2.allocationStart is null
这会获取日期范围的所有T1引用:
select T1.name, T2.rackName, T2.allocationStart from T2, T1
where T2.allocationStart > date_sub(curdate(),INTERVAL 60 day)
and T1.name = T2.rackName
group by T1.name
我需要的是来自T1的所有记录,在T2中没有针对特定日期范围的引用。我怎样才能做到这一点?
答案 0 :(得分:0)
为什么要按t1.name分组?如果同一个t1.name有多个记录,那么我建议将日期范围的t1引用放在cte中,然后使用它来执行左连接到t2。
答案 1 :(得分:0)
在我看来,这是两个子查询的左连接的组合。
我不明白你为什么这么说。您提供的第一个“子查询”返回表T1的所有内容,因此它等同于T1本身。现在,虽然可以形成T2中某些记录的内联视图并形成一个左连接,但这样做会有些过分。我,我会这样做:
select T1.*
from T1
left join T2
on T1.name = T2.rackName
and T2.allocationStart > date_sub(curdate(),INTERVAL 60 day)
where T2.rackName is null
这建立在你提出的第二个查询的基础上,假设T2.allocationStart
上的标准具有你想要的效果。请注意,我已将该标准合并到连接条件中,这对于实现所需的效果非常重要。然后where
子句选择那些表示没有相应T2行的T1行的行(根据连接条件);我们可以确定没有选择其他行,因为如果T2.rackName
为空,则它不能是T2.rackName = T1.name
,即使T1.name
也为空。