2011-09-23 4 views
0

MEMBER_ID 및 MEMBER_ID가 MEMBER_ID이고 MONEBER_ID가 MEMBER_ID 인 MEMBER 테이블이 외래 키로 'PHONE_IND'가 값 'S'(보조 전화) 또는 'P'(기본 전화) 전화 번호 세부 정보. 'S'는 우리의 핵심 가치입니다.Member 및 Member_phone 테이블 조인을 사용하는 Oracle SQL 쿼리

나는 'P'전화 번호 'S'가 존재하는 경우 전화로 회원 정보를 인출하지 않을 경우 오라클 쿼리가 필요합니다.

MEMBER_PHONE 테이블에서 각 부재는, 하나의 행으로 아니라면이어야 'P'를 'S'와 'P'의 두 가지 행을 가질 것이다.

미리 도움을 주셔서 감사합니다.

+0

Pls는 이후 동일한 샘플 데이터와 예상 출력. – Thinhbk

+0

몇 가지 샘플 소스 데이터와 원하는 출력을 표시하는 것이 좋습니다. 지금 당신의 의도를 알아내는 것은 매우 어렵습니다. –

답변

0
select m.* 
    from MEMBER m 
where exists (select 1 
        from MEMBER_PHONE mp 
       where mp.member_id = m.member_id 
        and mp.phone_ind = 'S'); 

편집 내가 이해 알고 있다고 생각

...

select m.* 
    , mp.* 
    from member m left outer join 
     member_phone mp on m.member_id = mp.member_id 
where (mp.phone_ind = 'S' 
    or (mp.phone_ind = 'P' 
    and not exists(select 1 
        from member_phone mp1 
        where mp1.member_id = mp.member_id 
         and mp1.phone_ind = 'S'))) 
+0

전화 데이터를 가져 오지 않습니다. – GolezTrol

+0

전화 데이터가 MEMBER_PHONE에 있다고 생각하기에는 너무 이상하지 않은 것 같습니다. 요점은 두 개의 기록이 있다는 것입니다. 둘 중 하나만 반환해야합니다. – GolezTrol

+0

@GolezTrol 제 편집을 보아요, 구조를 이해 한 것 같습니다. –

1

만약 내가 제대로 이해하고, 회원이 선택 사양 인 '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 
+0

3 쿼리는 나를 위해 매우 잘 작동하지만 난 "세르지오 미 헬스 '솔루션을 사용했다. 빠른 응답에 감사드립니다. – changeme

+0

내 첫 번째 모양을 의미합니까? ;) – GolezTrol

관련 문제