我有一张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桌子
在很多版本之前,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)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |