问题描述
我有两个要合并在一起的表:WORKORDER_1和WORKORDER_2。
--fake tables in WITH clause
with workorders_1 as (
select 'WO1' as wonum,null as parent from dual
union all
select 'WO100' as wonum,'WO1' as parent from dual
union all
select 'WO100' as wonum,'WO1' as parent from dual
),workorders_2 as (
select 'WO200' as wonum,'WO2' as parent from dual
union all
select 'WO200' as wonum,'WO2' as parent from dual
union all
select 'WO2' as wonum,null as parent from dual
)
select * from workorders_1
union all
select * from workorders_2
WONUM PARENT
----- ------
WO1
WO100 WO1
WO100 WO1
WO200 WO2
WO200 WO2
WO2
我想按合并的父ID对联合表进行排序:
- 如果PARENT不为null,请使用它
- 否则,请使用WONUM
结果如下:
WONUM PARENT [order by/coalesce]
----- ------ ----------
WO1 [WO1]
WO100 WO1 [WO1]
WO100 WO1 [WO1]
WO2 [WO2]
WO200 WO2 [WO2]
WO200 WO2 [WO2]
是否通过使用类合并逻辑而不使用子查询来排序?
解决方法
您可以在coalesce()
子句中使用order by
。对于这样的表达式,Oracle要求您将union
查询包装在子查询中:
select *
from (
select * from workorders_1
union all
select * from workorders_2
) t
order by coalesce(parent,wonum),wonum
,
您的列名表明正在进行层次结构。如果是这种情况,那么您应该考虑采用分层方法来查询数据https://docs.oracle.com/database/121/SQLRF/queries003.htm#SQLRF52332。
您可以在每个联合中使用按查询连接。如果从看起来像父行的地方开始,默认顺序将为您提供想要的东西:
with workorders_1 as (
select 'WO1' as wonum,null as parent from dual
union all
select 'WO100' as wonum,'WO1' as parent from dual
union all
select 'WO100' as wonum,'WO1' as parent from dual
),workorders_2 as (
select 'WO200' as wonum,'WO2' as parent from dual
union all
select 'WO200' as wonum,'WO2' as parent from dual
union all
select 'WO2' as wonum,null as parent from dual
)
select wonum,parent from workorders_1
connect by parent = prior wonum
start with parent is null
union all
select wonum,parent from workorders_2
connect by parent = prior wonum
start with parent is null
WONUM PARENT
WO1
WO100 WO1
WO100 WO1
WO2
WO200 WO2
WO200 WO2