SQL WHERE IN с левым соединением не возвращает все ожидаемые строки
Я создаю небольшое приложение для конъюгации / радикализации и наткнулся на проблему. У меня есть этот запрос 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')
Это возвращает:
| id | radical |
| 13 | to be |
Тем не менее, я хотел бы получить результат типа:
| id | radical | word |
| null | null | I |
| 13 | to be | am |
| null | null | a |
| null | null | cat |
Кто-нибудь знает как?
2 ответа
Решение
По-видимому, вы используете Left
Присоединяйтесь, когда вам действительно нужно Right
join (так как кажется, что вы хотите, чтобы все строки правой таблицы, соответствующие предикату, были возвращены)
Так что либо переключите соединение:
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');
Или переключите порядок таблиц в ОТ:
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');
Тебе необходимо 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
должно быть первым, потому что вы хотите сохранить все соответствующие строки в этой таблице.