Внешнее соединение с обязательной цепочкой - PullRequest
0 голосов
/ 11 апреля 2019

Представьте, что у меня есть эти данные

человек -> изменение адреса -> причины изменения адреса

Я хочу детали всех людей Я также хочу знать, изменили ли они когда-либо адрес из-за пожара. Поэтому я не хочу знать, каковы причины, но если они изменили адрес по одной причине.

Каждый человек может иметь несколько причин смены адреса

так что у меня

SELECT people.*
CASE WHEN add_change.reason_id is not NULL THEN
  'Y'
 ELSE 
  'N'
 END as been_fire
from people
left outer join add_change ON  person.id = add_change.person
left outer join add_change_reason ON add_change.reason_id = add_change_reason.id  AND add_change_reason.text = 'FIRE'

но это возвращает несколько строк на человека, если у них много изменений адреса.

Я не могу просто использовать

left outer join add_change ON add_change.person = person.id AND add_change.reason_id = 5

, поскольку это не фиксированные данные.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Вы можете выполнить левое соединение с производной таблицей, которая возвращает только идентификаторы лиц, у которых есть причина изменения 'FIRE':

SELECT p.*
       CASE WHEN cr.person IS NOT NULL THEN 'Y' ELSE 'N' END as been_fire
from people
  left join (
    select ac.person
    from add_change ac
    where exists (select *
                  from add_change_reason acr 
                  where acr.id  = ac.reason_id 
                    AND acr.text = 'FIRE')
  ) cr on cr.person = p.id
1 голос
/ 11 апреля 2019

Использование exists:

SELECT p.*,
       (CASE WHEN EXISTS (SELECT 1
                          FROM add_change ac JOIN
                               add_change_reason acr
                               ON ac.reason_id = acr.id 
NVL(address_change.reason,'N')
                          WHERE p.id = ac.person AND
                                acr.text = 'FIRE'
                         )
             THEN 'Y' ELSE 'N'
        END) as has_fire_address_change
from people p;

Обратите внимание, что при этом флаг поменяется на 'Y' и 'N', что и означает, что описание вашей проблемы предполагает, что вы хотите.

...