2017-09-01 34 views
0

這看起來應該是非常簡單的問題,但我一直在尋找過去兩天的答案,並且找不到它。請幫忙!NOT查詢中的SQL不需要的結果

我有沿

texts.text_id, texts.other_stuff... 
pairs.pair_id, pairs.textA, pairs.textB 

行第二表定義從第一表對條目的兩個表。

我需要的是一個普通的左反向連接查詢,如:

SELECT texts.text_id 
FROM texts 
    LEFT JOIN text_pairs 
    ON texts.text_id = text_pairs.textA 
WHERE text_pairs.textB = 123 
ORDER BY texts.text_id 

如何獲得專門配對與給定TEXTB的文本?我試過

WHERE text_pairs.textB != 123 OR WHERE text_pairs.textB IS NULL 

然而,這將返回所有的對,其中TEXTB不是123.所以,在情狀

textA TextB 
1   3 
1   4 
2   4 

如果我問TEXTB!= 3,查詢返回1和2.我需要的東西只會給我1.

+0

隨着LEFT JOIN需要ON子句,而不是在過濾WHERE子句...如果使用WHERE子句,則將LEFT JOIN轉換爲INNER JOIN –

+1

下一次,請參閱:[爲什麼我應該爲我認爲是非常簡單的SQL查詢提供一個MCVE?]( https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query) – Strawberry

+0

謝謝!回覆。 MCVE,也謝謝你,並指出。 – user4212

回答

1

第二張表的比較進入ON子句。然後添加一個條件,看是否有不匹配:

SELECT t.text_id 
FROM texts t LEFT JOIN 
    text_pairs tp 
    ON t.text_id = tp.textA AND tp.textB = 123 
WHERE tp.textB IS NULL 
ORDER BY t.text_id ; 

這個邏輯用NOT EXISTSNOT IN通常表示:

select t.* 
from texts t 
where not exists (select 1 
        from text_pairs tp 
        where t.text_id = tp.textA AND tp.textB = 123 
       ); 
+0

非常感謝!像魅力一樣工作,比我想要做的更有意義 – user4212

+0

爲什麼你回答這樣明顯的常見問題? – philipxy