使用同一个表中的并集对结果进行排序

Posted

技术标签:

【中文标题】使用同一个表中的并集对结果进行排序【英文标题】:Ordering results with a union from the same table 【发布时间】:2017-03-01 20:33:24 【问题描述】:

我需要先在列表中显示一组结果,然后再显示下表中的其余结果。

我尝试过SQL: how to use UNION and order by a specific select?,但在我的情况下似乎不起作用。

我的查询如下所示

SELECT * FROM (
    SELECT id, display as ordered
      FROM table
     WHERE id in (...) --these need to be first
    UNION
    SELECT id, display
      FROM table
     WHERE id not in (...) --these need to be at the end
)
ORDER BY ordered

无论我做什么,我的结果都会按显示顺序返回。

顺便说一句,我正在使用 Oracle。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您需要明确包含数字才能获得排序。此查询首先对第一个结果集进行排序,然后对第二个结果集进行排序。在每组中,结果再次按 id 排序。 (如果不需要,请删除它)

SELECT id,display FROM (
    SELECT id, display,1 as ordered
      FROM table
     WHERE id in (...) --these need to be first
    UNION
    SELECT id, display,2 
      FROM table
     WHERE id not in (...) --these need to be at the end
)
ORDER BY ordered,id

【讨论】:

@RobM 那你会考虑接受这个答案吗?更多用户将因此受益。【参考方案2】:

我认为你应该这样做:

select id, display
from table
order by (case when id in (. . .) then 1  -- first list
               when id in (. . .) then 3  -- last list
               else 2                     -- everything else
          end);

不需要unionunion all。只需一个 order by 表达式。

如果您不想要所有 id,则应包含 where 子句。

(我发现您的问题对于列表的构成有点不清楚。如果确实合适,您可以使用not in。)

【讨论】:

...并且,如果需要,可能添加 id(或其他任何内容)作为辅助排序标准

以上是关于使用同一个表中的并集对结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

SqlSever基础 union 联合查询,厉害的并集 重复项只显示一个 两个查询结果并在一起后排序

ES6数组:两个数组或数组对象取并集、交集、差集

在 O(mlogn) 时间内计算两个未排序数组的并集和交集

sql 优化union union allor使用

mysql中union和union all的区别(*)

SQL Server常用查询