我有一个UNION查询,我只希望对联合的一部分进行排序
Query1
UNION
Query2
UNION
Query3
所以,我只想按第三列对查询2进行排序。所有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
答案 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订购结果。