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

SQL UNION按两个不同的ORDER by子句排序并删除重复项,sql,oracle,sql-order-by,union,union-all,Sql,Oracle,Sql Order By,Union,Union All,在过去的两天里,我在stackoverflow和web上对此进行了研究,但仍然没有得到我想要的结果。我正在使用oracle11g。我有两个SQL查询,其中包含两个不同的ORDER BY子句。两者都必须保持正确的排序顺序。我只想将两者结合起来,同时删除重复项。我已经尝试从我的查询中删除重复项,它可以工作,但不能保留两个组合查询的排序顺序。如何删除重复项并为每个SQL查询保留正确的排序顺序? 下面是我的查询,它可以正确排序,但不会删除重复项。我需要做什么?所有2018年日期在整个查询结果集中重复一次

在过去的两天里,我在stackoverflow和web上对此进行了研究,但仍然没有得到我想要的结果。我正在使用oracle11g。我有两个SQL查询,其中包含两个不同的ORDER BY子句。两者都必须保持正确的排序顺序。我只想将两者结合起来,同时删除重复项。我已经尝试从我的查询中删除重复项,它可以工作,但不能保留两个组合查询的排序顺序。如何删除重复项并为每个SQL查询保留正确的排序顺序? 下面是我的查询,它可以正确排序,但不会删除重复项。我需要做什么?所有2018年日期在整个查询结果集中重复一次。我不要复制品。谢谢你的帮助

下面是我组合的两个查询(这是最上面的查询):

这是查询的底部部分:

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;
上面我的联合查询的结果:

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

按顺序执行
条款中的工作:

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\u launch\u date
存储为日期列,而不是字符列。

如果这是确切的查询,请注意,您正在根据预定的启动日期进行两种排序,而不是一种排序,另一种排序带有序列号。这样做非常好,并且完全符合我的需要。非常感谢。两天的沮丧过去了。
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;