SQL UNION 按两个不同的 ORDER BY 子句进行排序并删除重复项

SQL UNION to SORT by two different ORDER BY clauses and remove duplicates

过去两天我在 Whosebug 和网络上对此进行了研究,但仍然没有得到我想要的结果。我正在使用 ORACLE 11G。我有两个 SQL 查询,其中包含两个不同的 ORDER BY 子句。两者都必须保持正确的排序顺序。我只想将两者结合起来并删除重复项。我已经尝试 UNION 从我的查询中删除重复项并且它有效但不保留我的两个组合查询的排序顺序。如何为每个 SQL 查询删除重复项并保持正确的排序顺序? 下面是我的查询,它排序正确但确实删除了重复项。我需要做什么?所有 2018 年的日期在整个查询结果集中重复一次。我不想重复。谢谢您的帮助。

下面是我合并的两个查询(这是最热门的查询):

SELECT FLIGHT_NMBR, SCHEDULED_LAUNCH_DATE
FROM FLIGHTS
WHERE to_date(scheduled_launch_date, 'DD-MON-YY')
BETWEEN add_months(trunc(sysdate, 'MON'),0) 
AND add_months(trunc(sysdate, 'MON'),6) 
AND DATA_VERSION_NAME = 'WORKING' 
AND sequence_nmbr >= 0
ORDER BY SCHEDULED_LAUNCH_DATE ASC;

这是查询的底部:

SELECT FLIGHT_NMBR, SCHEDULED_LAUNCH_DATE
FROM FLIGHTS
WHERE DATA_VERSION_NAME = 'WORKING'
AND SEQUENCE_NMBR >= 0
ORDER BY sequence_nmbr asc;

然后这是我想出的组合查询,它并不像我想要的那样有效。我只想从下面的查询中删除重复项。我该怎么做?

WITH CTE_Sets AS (
SELECT 1 AS set_order, FLIGHT_NMBR, SCHEDULED_LAUNCH_DATE
FROM flights
WHERE to_date(scheduled_launch_date, 'DD-MON-YY')
BETWEEN add_months(trunc(sysdate, 'MON'),0) 
AND add_months(trunc(sysdate, 'MON'),6) 
AND DATA_VERSION_NAME = 'WORKING' 
AND sequence_nmbr >= 0
UNION
SELECT 2 AS set_order, FLIGHT_NMBR, SCHEDULED_LAUNCH_DATE
FROM flights
WHERE DATA_VERSION_NAME = 'WORKING'
AND SEQUENCE_NMBR >= 0
)
SELECT FLIGHT_NMBR, SCHEDULED_LAUNCH_DATE
FROM CTE_Sets
ORDER BY
set_order,
CASE set_order
    WHEN 1 THEN SCHEDULED_LAUNCH_DATE END ASC,
case set_order
WHEN 2 THEN SCHEDULED_LAUNCH_DATE END ASC;

上面的 UNION 查询结果:

FLIGHT_NMBR  SCHEDULED
------------ ---------
SpX-14       26-JAN-18
69P          09-FEB-18
SpX-DM1      09-MAR-18
54S          13-MAR-18
OA-9         14-MAR-18
55S          29-APR-18
SpX-15       06-JUN-18
SpX-DM2      22-JUN-18
70P          27-JUN-18
1A/R         20-NOV-98
2A           04-DEC-98

完成 order by 子句中的工作:

SELECT FLIGHT_NMBR, SCHEDULED_LAUNCH_DATE
FROM FLIGHTS
WHERE DATA_VERSION_NAME = 'WORKING' AND
      sequence_nmbr >= 0
ORDER BY (CASE WHEN to_date(scheduled_launch_date, 'DD-MON-YY') BETWEEN add_months(trunc(sysdate, 'MON'), 0) AND add_months(trunc(sysdate, 'MON'), 6) THEN 1 ELSE 2 END),
         (CASE WHEN to_date(scheduled_launch_date, 'DD-MON-YY') BETWEEN add_months(trunc(sysdate, 'MON'), 0) AND add_months(trunc(sysdate, 'MON'), 6) THEN SCHEDULED_LAUNCH_DATE END),
         sequence_nmbr;

注意:您应该将 scheduled_launch_date 存储为 date 列而不是 character 列。