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 должно быть первым, потому что вы хотите сохранить все соответствующие строки в этой таблице.

Другие вопросы по тегам