Как можно объединить 3 таблицы, ограничить запрос на основе условия и вернуть пустые столбцы, если условие не выполнено? - PullRequest
0 голосов
/ 18 сентября 2018

В настоящее время у меня есть следующий запрос:

select * from people
LEFT JOIN addresses
ON people.id = addresses.id
LEFT JOIN pers
ON people.id = pers.pers_id
WHERE people.id =:id
AND addresses.is_primary = 'Y'

Конечно, если для данного лица нет адреса, где is_primary = 'Y', запрос не возвращает никаких результатов.

Без is_primary = 'Y', запрос возвращает несколько адресов.

Есть ли способ вместо этого вернуть пустые столбцы для всех полей адреса в случае, когда нет записи для идентификатора, гдеis_primary = 'Y'?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

вариант использования, когда

 select *,case when addresses.is_primary not in('Y') then 'primary address different' else addresses.is_primary end as  is_primary  from people
    LEFT JOIN addresses
    ON people.pidm = addresses.pidm
    RIGHT JOIN pers
    ON people.id = pers.pers_id
    WHERE people.id =:id
0 голосов
/ 18 сентября 2018

Я настоятельно рекомендую вам не смешивать left join и right join. Запрос так трудно следовать.

Вместо этого начните с таблицы, в которой вы хотите сохранить все строки. Тогда используйте только left join. Иногда вам может потребоваться указать условия в предложении on.

В вашем случае:

select *
from people p left join
     addresses a
     on p.pidm = a.pidm and a.is_primary = 'Y' left join
     pers
     on p.id = pers.pers_id
where p.id = :id;
0 голосов
/ 18 сентября 2018

Вы можете сделать что-то вроде этого -

select *
  from people
  LEFT JOIN addresses
    ON people.pidm = addresses.pidm
   and addresses.is_primary = 'Y'
 RIGHT JOIN pers
    ON people.id = pers.pers_id
 WHERE people.id = :id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...