按联合查询的一部分排序

时间:2017-06-29 09:05:22

标签: sql oracle

我有一个UNION查询,我只希望对联合的一部分进行排序

Query1
UNION
Query2
UNION
Query3

所以,我只想按第三列对查询2进行排序。所有3个查询都有3列。

这可能吗?

3 个答案:

答案 0 :(得分:3)

  

“这可能吗?”

没有。 UNION是一个集合运算符,因此它会将每个查询的结果集转换为不同记录的新结果集。 查询2 的输出将不再可识别。

例外情况是,如果每个子查询本身都会生成一组唯一的记录,在这种情况下,您应该使用UNION ALL,它不会过滤重复项。虽然这引出了一个哲学观点:将结果集的一部分排序,其余部分未排序是什么意思?从字面上看,这会是什么样的?

答案 1 :(得分:1)

在Oracle中ORDER BY UNIONed嵌套查询是不可能的。你得到了APC的解释细节。

您可以使用subquery factoring来克服此

WITH T2SORTED
AS
(SELECT id FROM T2 ORDER BY id)
SELECT id FROM T1
UNION
SELECT id FROM T2SORTED
UNION
SELECT id FROM T3

SQLfiddle

答案 2 :(得分:0)

不,不是。是的,是的。你必须使用相同的order by对整个联合进行排序,但没有什么可以阻止你向整个联合添加一两列。

所以我们假设我们有桌子foo,bar和baz。每个都有列A,B和C.让我们使用B作为您要排序的列。我们将通过bar和baz订购B.我们还会强制A的所有结果出现在B的所有结果之前,然后将它们放在C之前。我们必须这样做,以确保B的结果是有序的。

select a.foo
, a.bar
, a.baz
, 0 as primary_sort
, 0 as secondary_sort
from A
union
select b.foo
, b.bar
, b.baz
, 1 as primary_sort
, row_number() over (order by b.bar, b.baz) as secondary_sort
from B
union
select c.foo
, c.bar
, c.baz
, 2 as primary_sort
, 0 as secondary_sort
from C
order by primary_sort, secondary_sort;

然后,如果你不想传递那些排序列,你可以在它周围包装一个select语句:

select foo, bar, baz from (
-- query from above WITHOUT the order by
) order by primary_sort, secondary_sort;

关键是primary_sort必须在每个查询中都是相同的类型,secondary_sort也是如此。 row_number()功能允许您根据需要添加任意数量的列,并将其减少为单个数字。所以over (order by ... )实际上是声明你想如何从B订购结果。