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');
我正在构建一个 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');