首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL UNION按两个不同的ORDER子句排序并删除重复项

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

Stack Overflow用户
提问于 2018-01-12 16:48:20
回答 1查看 152关注 0票数 2

在过去的两天里,我一直在堆栈溢出和网络上研究这个问题,但仍然没有得到我想要的结果。我正在使用ORACLE 11G。我有两个带有两个不同ORDER子句的SQL查询。两者都必须保持正确的排序顺序。我只想把这两者结合起来,去掉重复的东西。我已经尝试过从我的查询中删除重复项,并且它可以工作,但是没有保留我对两个合并查询的排序顺序。如何删除重复项,并为每个SQL查询保留两个正确的排序顺序?下面是我下面的查询,它正确排序,但确实删除了重复项。我该怎么办?所有2018年的日期在整个查询结果集中重复一次。我不想要重复的。谢谢你的帮助。

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

代码语言:javascript
复制
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;

这是查询的底部:

代码语言:javascript
复制
SELECT FLIGHT_NMBR, SCHEDULED_LAUNCH_DATE
FROM FLIGHTS
WHERE DATA_VERSION_NAME = 'WORKING'
AND SEQUENCE_NMBR >= 0
ORDER BY sequence_nmbr asc;

下面是我想出的合并查询,它不太像我想要的那样工作。我只想从下面的查询中删除重复的内容。我该怎么做?

代码语言:javascript
复制
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查询的结果:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-12 16:58:25

order by子句中完成以下工作:

代码语言:javascript
复制
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存储为日期列,而不是字符列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48230609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档