2011-09-23 76 views
0

將MEMBER_ID和MEMBER_PHONE表的MEMBER_ID作爲外鍵,將PHONE_IND作爲值爲'S'(輔助電話)或'P'(主電話)的列之一與電話號碼細節。 'S'是我們的關鍵價值。帶有Member和Member_phone表的Oracle SQL查詢加入

如果'S'存在,如果不是'P'電話號碼,我需要oracle查詢來通過電話獲取成員信息。

在MEMBER_PHONE表中,每個成員將有兩個可能的'S'和'P'行,如果不是至少'P'作爲一行。

在此先感謝您的幫助。

+0

請發佈相同的樣本數據和您的預期輸出。 – 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

第三個查詢對我來說效果很好,但我使用了「SérgioMichels」解決方案。感謝您的快速回復。 – changeme

+0

你的意思是看起來像我的第一個? ;) – GolezTrol