我们说我有一张表A,其中包含a_1和a_2列。
我只对列a_1
感兴趣,所以我可以这样写:
select a_1 from A;
但是我想按列a_2
排序,所以我可以这样写:
select a_1 from A order by a_2 desc;
现在我想做一个工会:
select a_1 from A where <some filters>
union
select a_1 from A where <some other filters>
order by a_2 desc;
这不再适用("a_2": invalid identifier
),所以我将其更改为:
select a_1, a_2 from A where <some filters>
union
select a_1, a_2 from A where <some other filters>
order by a_2 desc;
select a_2
部分困扰我:我不希望它显示在结果中,我该如何隐藏这些信息?
答案 0 :(得分:1)
从概念上讲,在order by a_2
完成union
之后a_1
对a_1
没有意义。从Oracle的角度来看,对于任一查询中的任何不同a_2
值,完全有可能返回许多不同的a_1
值。所以有很多可能的排序顺序。
当然,您可以嵌套查询,以便只在结果中获得select a_1
from (select a_1, a_2 from A where <some filters>
union
select a_1, a_2 from A where <some other filters>) sub_q
order by a_2 desc;
union all
当然,从性能角度来看,使用union
而不是or
是有意义的,除非您确实希望查找并消除重复的行。如果两个查询实际上都来自同一个表,那么使用union
的单个查询而不是编写两个不同查询的{{1}}可能更有意义。
答案 1 :(得分:0)
假设两列上的UNION
产生:
a_1 a_2
A 1
A 3
B 2
然后只有a_1的UNION
会给出
a_1
A
B
你怎么知道根据a_2的第1和第3列放置A的位置?
当UNION
(或DISTINCT
)时,ORDER BY
中只允许选定的列!
但是,某些dbms产品在UNION ALL
!