按未选择的列进行联合和排序

时间:2015-06-04 14:17:00

标签: sql oracle

我们说我有一张表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部分困扰我:我不希望它显示在结果中,我该如何隐藏这些信息?

2 个答案:

答案 0 :(得分:1)

从概念上讲,在order by a_2完成union之后a_1a_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

时允许未选择的列