Oracle SQL查询与成员和成员电话表联接
主键为MEMBER_ID的MEMBER表和MEMBER_ID的MEMBER_PHONE表作为外键,PHONE_IND作为值为“S”(辅电话)或“p”(主电话)以及电话号码详细信息的列之一S’是我们的关键价值观 如果存在“S”,如果没有“p”电话号码,我需要oracle query通过电话获取成员信息 在MEMBER_电话表中,每个成员将有两行可能的'S'和'p',如果不是的话,至少将'p'作为一行 提前感谢你的帮助Oracle SQL查询与成员和成员电话表联接,sql,oracle,Sql,Oracle,主键为MEMBER_ID的MEMBER表和MEMBER_ID的MEMBER_PHONE表作为外键,PHONE_IND作为值为“S”(辅电话)或“p”(主电话)以及电话号码详细信息的列之一S’是我们的关键价值观 如果存在“S”,如果没有“p”电话号码,我需要oracle query通过电话获取成员信息 在MEMBER_电话表中,每个成员将有两行可能的'S'和'p',如果不是的话,至少将'p'作为一行 提前感谢你的帮助 select m.* from MEMBER m where exists
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]再次被一条评论吸引到这个问题上,所以我决定再添加一条。正如你所看到的,很难不解决这个问题
请发布相同的样本数据和您的预期输出。最好显示一些样本源数据和您想要的输出。现在很难看出您的意图。它无法获取电话数据。假设电话数据在MEMBER_phone中似乎并不奇怪。关键是,它包含两条记录。只有一个应该返回。@GolezTrol查看我的编辑,我想我知道我理解了结构。太好了。现在把N改成P,你就得到了我的第一个答案我使用了第二个查询,效果非常好,非常感谢您的快速响应。第三个查询对我来说效果非常好,但我使用了“Sérgio Michels”解决方案。谢谢你的快速回复。你是说看起来像我第一个的那个吗?;)
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