我有两张看起来像的表:
table A:
ID, target_date, target_ID
table B:
ID, target_ID, begin_date, end_date
表B可能具有相同target_ID但不同日期范围的多个记录。我感兴趣的是一个SQL查询,它能够返回不在给定target_ID的begin_date和end_date范围内的target_dates。
答案 0 :(得分:2)
这有一个诀窍。使用left join
查找匹配的内容,然后选择不匹配的内容:
select a.*
from tablea a left join
tableb b
on a.target_id = b.target_id and
a.target_date between b.begin_date and b.end_date
where b.target_id is null;
您可以通过几种不同的方式表达这一点。例如,not exists
似乎也很自然:
select a.*
from tablea a
where not exists (select 1
from tableb b
where a.target_id = b.target_id and
a.target_date between b.begin_date and b.end_date
);
注意:我使用between
进行这些比较是一种方便的简写(与您在问题中使用的语言相匹配)。通常使用日期,首选明确使用<
,<=
,>
或>=
。
答案 1 :(得分:1)
SELECT A.target_date
FROM A LEFT OUTER JOIN B
ON (A.target_ID=B.target_ID
AND A.target_date>=B.begin_date
AND A.target_date<=B.end_date)
WHERE B.begin_date IS NULL
答案 2 :(得分:1)
也许:
SELECT target_date FROM A
INNER JOIN B
ON A.target_ID = B.target_ID
WHERE target_date NOT BETWEEN begin_date AND end_date