만약 내가 제대로 이해하고, 회원이 선택 사양 인 'S'전화 번호를 가질 수 항상있을 것이다 'P'전화 번호. 'S'번호가 있으면 해당 번호와 함께 회원 정보를 반환하고 싶습니다. 그렇지 않다면 폴백하고 회원 정보를 'P'번호와 함께 반환 하시겠습니까?
select
*
from
MEMBER m
inner join MEMBER_PHONE p on p.MEMBER_ID = m.MEMBER_ID
where
p.PHONE_IND = 'S' or
(p.PHONE_IND = 'P' and
not exists (
select *
from MEMBER_PHONE p
where p.PHONE_IND = 'S' and p.MEMBER_ID = m.MEMBER_ID)
)
[편집] 그것은 재미있는 질문입니다. 완전히 다른 접근 방식은 다음과 같습니다.
select
m.*,
pp.*
from
MEMBER m
left join MEMBER_PHONE ps
on ps.MEMBER_ID = m.MEMBER_ID
and ps.PHONE_IND = 'S'
inner join MEMBER_PHONE pp
on pp.MEMBER_ID = m.MEMBER_ID
and pp.PHONE_IND = nvl(ps.PHONE_IND, 'P')
자신이 가장 잘 작동하는지 확인하십시오.
은 [편집 2] 댓글 다시이 질문에 그린, 그래서 나는 또 다른 하나를 추가하기로 결정했다. 보시다시피이 문제를 해결하는 것은 어렵습니다. ;-)
select
*
from
(select
m.*,
p.*,
dense_rank() over (
partition by m.MEMBER_ID
order by decode(p.PHONE_IND, 'S', 1, 2)) as RANK
from
MEMBER m
inner join MEMBER_PHONE p on pp.MEMBER_ID = m.MEMBER_ID)
where
RANK = 1
Pls는 이후 동일한 샘플 데이터와 예상 출력. – Thinhbk
몇 가지 샘플 소스 데이터와 원하는 출력을 표시하는 것이 좋습니다. 지금 당신의 의도를 알아내는 것은 매우 어렵습니다. –