的一个部分,我有一个联合查询,我想只是一个联盟的一部分进行排序为了通过联合查询
Query1
UNION
Query2
UNION
Query3
所以,我只想排序查询2,第三列。所有3个查询都有3列。
这可能吗?
的一个部分,我有一个联合查询,我想只是一个联盟的一部分进行排序为了通过联合查询
Query1
UNION
Query2
UNION
Query3
所以,我只想排序查询2,第三列。所有3个查询都有3列。
这可能吗?
“这可能吗?”
编号UNION是一个集合运算符,因此它会将每个查询的结果集嵌入不同记录的新结果集中。 查询2的输出将不再可识别。
例外情况是,如果每个子查询自己生成一组唯一的记录,则应使用UNION ALL,该过程不会筛选重复项。尽管这引出了一个哲学观点:将结果集的一部分进行排序而其余未排序是什么意思?从字面上看,这将是什么样子?
'UNION是一个集合运算符,因此它会将每个查询的结果集嵌入不同记录的新结果集中......这意味着(至少对我来说)所有集合运算符都会做同样的事情,除了'UNION ALL'是一个集合运算符,但它并不区分记录(并且,顺便说一句,将允许其中一个查询的记录被命令和其余无序)。也许是语义学,但是'UNION是一个集合运算符,这个集合运算符'使得它更清晰,恕我直言。 – Boneist
在数学中,一个集合是一组不同的对象,所以可以认为'union all'不是一个集合运算符:)但是然后RDBMSs经常与集合理论一起玩fast'n'loose – APC
在所有计数中都是真的! * {;-) – Boneist
在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
这工作。谢谢。 – user1936588
@ user1936588它可能已经工作,但它仍然绝对没有意义做到这一点,恕我直言。要么甲骨文足够聪明地忽略命令,否则你将迫使甲骨文做一个额外的,不必要的步骤。即使你的结果集彼此是唯一的(即一组特定的值只能出现在其中一个查询中),你仍然不能保证输出将保持你想要的顺序。 – Boneist
如果这没有意义,他的问题是没有道理的,情况可能如此。我刚刚回答了这个问题。 –
不,事实并非如此。是的。你必须用同样的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订购结果的方式。
请在sort2中排序并用括号包装query2吗? – Blank
我试过并得到错误“缺少右括号” – user1936588
“(Query2)”是否给你“缺少右括号”? – Blank