sql oracle:当type不存在时获取null值

Big*_*gjo 2 sql oracle

我有一张phone包含这些值的表格

emplid  type    phone
1       HOME    23452
2       HOME    15284
2       BUSN    25523
3       HOME    26542
Run Code Online (Sandbox Code Playgroud)

我希望每个人都能使用他的HOME和BUSN手机.当他没有BUSN手机时,它必须为空.所以我的结果必须是:

emplid  type    phone
1       HOME    23452
2       HOME    15284
2       BUSN    25523
3       HOME    26542
1       BUSN    null
3       BUSN    null
Run Code Online (Sandbox Code Playgroud)

我试着加入一个虚拟表

(select 'HOME'as typ from dual
                union select 'HOM2' from dual )
Run Code Online (Sandbox Code Playgroud)

但它没有给我想要的结果.我不知道如何加入我的phone桌子

mat*_*guy 5

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

您需要一个包含需要包含的各种类型的表.或者,正如您尝试的那样,您可以动态创建它.另外,您需要外部联接的"partition"子句.它在下面的代码中显示在ALL CAPS中(因此可以很容易地找到它).

作为一个单独且无关的东西,在我创建的"helper"子查询中,我替换了一个实际的"types"表,我还创建了一个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          
Run Code Online (Sandbox Code Playgroud)