sql的union default order by子句?

mbyulnm0  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(271)

我注意到当我通过union合并两个表时,顺序不是我所期望的。
微积分课程

Kevin   Le      kevinle892@email.edu
Jackie  Chan    jchan@email.edu
Sam     Smit    ssmitten@email.edu

统计\u类

Kay     Lam     klam204@email.edu
Jackie  Chan    jchan@email.edu
Pooja   Pri     ppriyanka@email.edu

当我把上面的两张table合起来

select * from calculus_class
union 
select * from stats_class

我希望结果是这样从上到下排列的:

Kevin   Le      kevinle892@email.edu
Jackie  Chan    jchan@email.edu
Sam     Smit    ssmitten@email.edu
Kay     Lam     klam204@email.edu
Jackie  Chan    jchan@email.edu
Pooja   Pri     ppriyanka@email.edu

这是我使用dbeaver postgresql得到的结果:

Kevin   Le      kevinle892@uci.edu
Pooja   Pri     ppriyanka@uci.edu
Jackie  Chan    jchan473@uci.edu
Sam     Smit    ssmitten@uci.edu
Kay     Lam     klam204@uci.edu
kxkpmulp

kxkpmulp1#

实际上,你用的是 union 删除重复项,但您不希望删除重复项。所以就用吧 union all :

select * from calculus_class
union all
select * from stats_class;

如果确实要对结果进行排序,则需要记住,sql表和结果集表示无序集。如果您确实希望结果按某种方式排序,可以添加 order by :

select * from calculus_class
union all
select * from stats_class
order by fname;

这是一把小提琴。

jgzswidk

jgzswidk2#

您似乎假设表行具有固有的顺序。事实并非如此。表是无序行集的模式,没有任何默认的排序。
除非你加上 order by 子句中,返回行的顺序是未定义的:数据库可以随意按其喜欢的顺序返回行—这在同一查询的连续执行中可能是一致的,也可能不是一致的。对于由 union 查询(实际创建派生表)。
所以,如果你想订购,一定要使用 order by 不清楚应该用哪一列,所以我把 ? 在查询中。

select *
from (
    select * from calculus_class
    union all
    select * from stats_class
) t
order by  ?

如果要首先从第一个表中选择行,可以执行以下操作:

select *
from (
    select 1 rn, c.* from calculus_class c
    union all
    select 2 rn, s.* from stats_class
) t
order by  rn

注意我变了 unionunion all :除非您确实希望消除两个表之间的重复项(这是 union ), union all 效率更高,应该经常使用。

vlurs2pr

vlurs2pr3#

不需要嵌套查询:
从微积分中选择1个rn,c.*类c并集所有从统计中选择2个rn,s.*类顺序为1

相关问题