之間選擇我有一個看起來像兩個表:SQL:紅棗
table A:
ID, target_date, target_ID
table B:
ID, target_ID, begin_date, end_date
表B可能有相同的target_ID但不同的日期範圍的多個記錄。我對能夠返回不在指定target_ID的begin_date和end_date範圍內的target_dates的SQL查詢感興趣。
之間選擇我有一個看起來像兩個表:SQL:紅棗
table A:
ID, target_date, target_ID
table B:
ID, target_ID, begin_date, end_date
表B可能有相同的target_ID但不同的日期範圍的多個記錄。我對能夠返回不在指定target_ID的begin_date和end_date範圍內的target_dates的SQL查詢感興趣。
這是一個竅門。尋找匹配的那些,使用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
這些比較作爲一種方便的簡寫(以配合您的問題使用的語言)。通常使用日期,明確使用<
,<=
,>
或>=
是優選的。
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
可能:
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
你能提供什麼,你已經嘗試過的樣本? –
可能不那麼重要,但是您應該爲您正在使用的DBMS添加標籤(Postgres,Oracle,...) –