將MEMBER_ID和MEMBER_PHONE表的MEMBER_ID作爲外鍵,將PHONE_IND作爲值爲'S'(輔助電話)或'P'(主電話)的列之一與電話號碼細節。 'S'是我們的關鍵價值。帶有Member和Member_phone表的Oracle SQL查詢加入
如果'S'存在,如果不是'P'電話號碼,我需要oracle查詢來通過電話獲取成員信息。
在MEMBER_PHONE表中,每個成員將有兩個可能的'S'和'P'行,如果不是至少'P'作爲一行。
在此先感謝您的幫助。
將MEMBER_ID和MEMBER_PHONE表的MEMBER_ID作爲外鍵,將PHONE_IND作爲值爲'S'(輔助電話)或'P'(主電話)的列之一與電話號碼細節。 'S'是我們的關鍵價值。帶有Member和Member_phone表的Oracle SQL查詢加入
如果'S'存在,如果不是'P'電話號碼,我需要oracle查詢來通過電話獲取成員信息。
在MEMBER_PHONE表中,每個成員將有兩個可能的'S'和'P'行,如果不是至少'P'作爲一行。
在此先感謝您的幫助。
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')))
如果我理解正確的話,該成員可以有一個可選的 '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
請發佈相同的樣本數據和您的預期輸出。 – Thinhbk
最好顯示一些示例源數據和你想要的輸出。現在很難分辨你的意圖。 –