Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按联合查询的一部分排序_Sql_Oracle - Fatal编程技术网

Sql 按联合查询的一部分排序

Sql 按联合查询的一部分排序,sql,oracle,Sql,Oracle,我有一个联合查询,我只想对联合的一部分进行排序 Query1 UNION Query2 UNION Query3 所以,我只想按第三列对查询2进行排序。所有3个查询都有3列 这可能吗 “这可能吗?” 不可以。UNION是一个集合运算符,因此它会将每个查询的结果集转换为一个新的不同记录的结果集。查询2的输出将不再是可识别的 例外情况是,如果每个子查询都以自己的权限生成一组唯一的记录,那么您应该使用UNION ALL,它不过滤重复项。尽管这引出了一个哲学观点:对结果集的一部分进行排序,而对其余部分

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

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

这可能吗

“这可能吗?”

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

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

“这可能吗?”

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


例外情况是,如果每个子查询都以自己的权限生成一组唯一的记录,那么您应该使用UNION ALL,它不过滤重复项。尽管这引出了一个哲学观点:对结果集的一部分进行排序,而对其余部分进行未排序意味着什么?从字面上看,这是什么样子?

在Oracle中,不可能通过联合嵌套查询对
进行排序。你得到了APC的详细解释

你可以用它来克服这个问题

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

在Oracle中,无法通过联合嵌套查询对
进行排序。你得到了APC的详细解释

你可以用它来克服这个问题

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

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

假设我们有桌子foo、bar和baz。每个都有A、B和C列。让我们使用B作为要排序的列。我们要B酒吧和baz。我们还将强制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;

关键是
主排序
在每个查询中必须是相同的类型,
次排序
也必须是相同的类型。
row\u number()
函数允许您在排序中添加任意数量的列,并将其减少为单个数字。因此,
over(orderby…
实际上声明了您希望如何对B的结果进行排序。

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

假设我们有桌子foo、bar和baz。每个都有A、B和C列。让我们使用B作为要排序的列。我们要B酒吧和baz。我们还将强制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;

关键是
主排序
在每个查询中必须是相同的类型,
次排序
也必须是相同的类型。
row\u number()
函数允许您在排序中添加任意数量的列,并将其减少为单个数字。因此,
over(order by…
实际上声明了您希望如何对B中的结果进行排序。

在query2中进行排序,并用括号将query2括起来?我尝试了一下,得到了错误“缺少右括号”是否
(query2)
提供了“缺少右括号”?无法完成。(重复消除…)其中一个查询中的行是否可以显示在其他查询中?或者一行只能出现在单个查询中?例如,如果值(1、2、3)由query1返回,那么(1、2、3)可以由query2或query3返回吗?如果给定的行只能由其中一个查询生成,那么这些联合实际上应该是联合ALL,完全可以满足您的要求。是否在query2中排序并用括号括起query2?我尝试了这一点,得到了错误“缺少右括号”是否
(query2)
提供了“缺少右括号”?无法完成。(重复消除…)其中一个查询中的行是否可以显示在其他查询中?或者一行只能出现在单个查询中?例如,如果值(1、2、3)由query1返回,那么(1、2、3)可以由query2或query3返回吗?如果给定的行只能由其中一个查询生成,那么这些联合实际上应该是联合所有,完全可以满足您的要求。
联合是一个集合运算符,因此它将把每个查询的结果集合并到一个不同记录的新结果集中。
。。。这意味着(至少对我来说)所有集合运算符都将执行相同的操作,除了
UNION all
是集合运算符,但它不区分记录(顺便说一句,将允许对其中一个查询的记录进行排序,而对其他查询的记录进行无序排序)。也许是语义,但是,
UNION是一个集合运算符,它使…
更清楚,IMHO。在数学中,集合是一组不同的对象,因此可以说,
UNION all
不是一个集合运算符:)但是,RDBMS经常在所有方面都与集合论真玩得很快*{;-)
UNION是一个集合运算符,因此它会将每个查询的结果集转换为一个新的不同记录的结果集
。这意味着(至少对我来说)所有集合运算符都将执行相同的操作,除了
UNION all
是一个集合运算符,但它不会区分记录(顺便说一句,这将允许对其中一个查询的记录进行排序,而对其他查询的记录进行无序排序)。语义可能是这样,但
UNION是一个集合运算符,它使用munges…
在数学中更为清晰