全部合并:按合并顺序排序不带子查询

问题描述

我有两个要合并在一起的表: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

Demo on DB Fiddle

,

您的列名表明正在进行层次结构。如果是这种情况,那么您应该考虑采用分层方法来查询数据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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...