想象一下,我有这些数据
人 - >地址变更 - >地址变更原因
我想要所有人的详细信息,如果他们因火灾而改变地址,我也想知道。所以我不想知道原因是什么,但如果他们因为一个原因改变了地址。
每个人都可能有多个地址变更原因
所以我有
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
因为这不是固定数据。
使用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'
,这就是您所需要的问题描述。
您可以对派生表执行左连接,该派生表仅返回具有更改原因'FIRE'的人员ID:
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