2014-06-30 45 views
0

之間選擇我有一個看起來像兩個表: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查詢感興趣。

+1

你能提供什麼,你已經嘗試過的樣本? –

+0

可能不那麼重要,但是您應該爲您正在使用的DBMS添加標籤(Postgres,Oracle,...) –

回答

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
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 
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