2017-06-29 86 views
0

的一个部分,我有一个联合查询,我想只是一个联盟的一部分进行排序为了通过联合查询

Query1 
UNION 
Query2 
UNION 
Query3 

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

这可能吗?

+0

请在sort2中排序并用括号包装query2吗? – Blank

+0

我试过并得到错误“缺少右括号” – user1936588

+0

“(Query2)”是否给你“缺少右括号”? – Blank

回答

3

“这可能吗?”

编号UNION是一个集合运算符,因此它会将每个查询的结果集嵌入不同记录的新结果集中。 查询2的输出将不再可识别。

例外情况是,如果每个子查询自己生成一组唯一的记录,则应使用UNION ALL,该过程不会筛选重复项。尽管这引出了一个哲学观点:将结果集的一部分进行排序而其余未排序是什么意思?从字面上看,这将是什么样子?

+0

'UNION是一个集合运算符,因此它会将每个查询的结果集嵌入不同记录的新结果集中......这意味着(至少对我来说)所有集合运算符都会做同样的事情,除了'UNION ALL'是一个集合运算符,但它并不区分记录(并且,顺便说一句,将允许其中一个查询的记录被命令和其余无序)。也许是语义学,但是'UNION是一个集合运算符,这个集合运算符'使得它更清晰,恕我直言。 – Boneist

+0

在数学中,一个集合是一组不同的对象,所以可以认为'union all'不是一个集合运算符:)但是然后RDBMSs经常与集合理论一起玩fast'n'loose – APC

+0

在所有计数中都是真的! * {;-) – Boneist

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

+0

这工作。谢谢。 – user1936588

+1

@ user1936588它可能已经工作,但它仍然绝对没有意义做到这一点,恕我直言。要么甲骨文足够聪明地忽略命令,否则你将迫使甲骨文做一个额外的,不必要的步骤。即使你的结果集彼此是唯一的(即一组特定的值只能出现在其中一个查询中),你仍然不能保证输出将保持你想要的顺序。 – Boneist

+0

如果这没有意义,他的问题是没有道理的,情况可能如此。我刚刚回答了这个问题。 –

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订购结果的方式。