我注意到当我通过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
3条答案
按热度按时间kxkpmulp1#
实际上,你用的是
union
删除重复项,但您不希望删除重复项。所以就用吧union all
:如果确实要对结果进行排序,则需要记住,sql表和结果集表示无序集。如果您确实希望结果按某种方式排序,可以添加
order by
:这是一把小提琴。
jgzswidk2#
您似乎假设表行具有固有的顺序。事实并非如此。表是无序行集的模式,没有任何默认的排序。
除非你加上
order by
子句中,返回行的顺序是未定义的:数据库可以随意按其喜欢的顺序返回行—这在同一查询的连续执行中可能是一致的,也可能不是一致的。对于由union
查询(实际创建派生表)。所以,如果你想订购,一定要使用
order by
不清楚应该用哪一列,所以我把?
在查询中。如果要首先从第一个表中选择行,可以执行以下操作:
注意我变了
union
至union all
:除非您确实希望消除两个表之间的重复项(这是union
),union all
效率更高,应该经常使用。vlurs2pr3#
不需要嵌套查询:
从微积分中选择1个rn,c.*类c并集所有从统计中选择2个rn,s.*类顺序为1