我有一个带有这些值的表phone

emplid  type    phone 
1       HOME    23452 
2       HOME    15284 
2       BUSN    25523 
3       HOME    26542 

我想让每个人都喜欢他的HOME和BUSN电话。如果他没有BUSN电话,则必须为空。所以我的结果必须是:
emplid  type    phone 
1       HOME    23452 
2       HOME    15284 
2       BUSN    25523 
3       HOME    26542 
1       BUSN    null 
3       BUSN    null 

我试图加入一个哑表
(select 'HOME'as typ from dual 
                union select 'HOM2' from dual ) 

但这并没有给我想要的结果。我不知道如何将其与 phone表一起加入

请您参考如下方法:

在许多版本之前,Oracle仅为此类问题引入了分区的外连接。 https://docs.oracle.com/cd/E11882_01/server.112/e25555/tdpdw_sql.htm#TDPDW0072

您确实需要一个包含各种类型的表。或者,您可以尝试动态创建它。另外,您需要外部联接的“partition”子句。它显示在下面代码的ALL CAPS中(因此可以轻松找到它)。

作为单独的,不相关的内容,在我创建的“helper”子查询中以替代实际的“类型”表时,我还创建了一个ORD列,用于进行排序。仅当您要始终在主查询中的BUSN编号之前始终显示HOME编号时,才需要这样做。当然,还有其他方法可以达到相同的结果,但是由于无论如何我们都创建了一个辅助子查询,因此基本上不需要额外的费用就可以得到它。

with 
  phone(emplid, type, phone) as ( 
    select 1, 'HOME', 23452 from dual union all 
    select 2, 'HOME', 15284 from dual union all 
    select 2, 'BUSN', 25523 from dual union all 
    select 3, 'HOME', 26542 from dual 
  ) 
-- end of sample data (for testing only, not part of the actual query) 
select p.emplid, h.type, p.phone 
from   ( 
         select 'HOME' as type, 1 as ord from dual union all 
         select 'BUSN'        , 2        from dual 
       ) h 
       left outer join phone p  PARTITION BY (EMPLID) 
       on h.type = p.type 
order by p.emplid, h.ord      
; 
 
    EMPLID TYPE      PHONE 
---------- ---- ---------- 
         1 HOME      23452 
         1 BUSN            
         2 HOME      15284 
         2 BUSN      25523 
         3 HOME      26542 
         3 BUSN           


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!