Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL查询与成员和成员电话表联接_Sql_Oracle - Fatal编程技术网

Oracle SQL查询与成员和成员电话表联接

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

主键为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 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