SQL 使用 Left Join 的 WHERE IN 没有返回我期望的所有行

SQL WHERE IN with Left Join is not returning all rows I expect

我正在构建一个 conjugation/radicalization 小应用程序,我偶然发现了一个问题。我有这个 SQL 请求:

SELECT    DISTINCT RA.* 
FROM      radical RA 
left join conjugated CO 
on        CO.word_id = RA.id 
where     CO.conjugation IN ('I', 'am', 'a', 'cat')

那个returns:

| id | radical |
| 13 |  to be  |

但是,我想得到一个类型的结果:

| id   | radical | word |
| null |  null   |  I   |
|  13  | to be   | am   |
| null |  null   |  a   |
| null |  null   | cat  |

有人知道怎么做吗?

你需要一个left join,但要从你想保留的所有单词开始:

select w.word, ra.* 
from (select 'I' as word union all
      select 'am' union all select 'a' union all select 'cat'
     ) w left join
     conjugated co
     on co.conjugation = w.word left join
     radical ra
     on ra.id = co.word_id;  

如果这些值在 conjugation 中,您可以简单地执行以下操作:

select c.onjugation, ra.* 
from conjugated co left join
     radical ra
     on ra.id = co.word_id
where c.conjugation in ('I', 'am', 'a', 'cat') ;

也就是说,conjugation 应该排在第一位,因为您希望保留 table 中的所有匹配行。

看似您正在使用 Left 联接,但实际上您需要 Right 联接(因为看起来您希望返回与谓词匹配的正确 table 的所有行)

所以要么切换连接:

SELECT    DISTINCT RA.*, co.`conjugated` as word
FROM      radical RA 
right join conjugated CO 
on        CO.word_id = RA.id 
where     CO.conjugation IN ('I', 'am', 'a', 'cat');

或者调换 FROM 中 table 的顺序:

SELECT    DISTINCT RA.*, co.`conjugated` as word
FROM      conjugated CO 
left join radical RA 
on        CO.word_id = RA.id 
where     CO.conjugation IN ('I', 'am', 'a', 'cat');