我有一个带有这些值的表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