2017-09-01 37 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