使用UNION子句合并两个查询结果时如何保留各自的排序规则?
排序失效原因
UNION 合并结果集时会忽略子查询内部的 ORDER BY 规则,这是SQL的标准设计:UNION默认会对合并后的结果做去重处理,过程中会重新排列所有行的顺序,因此单独子查询的排序逻辑在合并后不会生效。
修复方法
通过新增分组排序标识、将所有排序逻辑转移到合并后的外层执行即可解决问题,此外两个结果集不存在重复值,可以用 UNION ALL 代替 UNION 避免不必要的去重操作,提升执行效率。
修改后的完整代码如下:
SELECT result_content FROM ( -- 第一部分:输出姓名+职业首字母 SELECT CONCAT(name,'(',LEFT(occupation,1),')') AS result_content, 1 AS sort_group, name AS sort1, NULL AS sort2 FROM occupations UNION ALL -- 第二部分:输出职业统计 SELECT CONCAT('There are a total of ', COUNT(*),' ',occupation,'s.') AS result_content, 2 AS sort_group, COUNT(*) AS sort1, CASE WHEN occupation = 'Doctor' THEN 1 WHEN occupation = 'Singer' THEN 2 WHEN occupation = 'Actor' THEN 3 WHEN occupation = 'Professor' THEN 4 END AS sort2 FROM occupations GROUP BY occupation ) AS combined ORDER BY sort_group ASC, sort1 ASC, sort2 ASC;
逻辑说明
- 新增的
sort_group字段用来区分两部分结果,保证第一部分的姓名类结果全部排在第二部分的统计类结果之前 - 两个子查询各自把需要的排序字段作为辅助列带出,外层统一排序的规则和你原本的需求完全一致:第一部分按姓名字母排序,第二部分先按统计数量升序,再按职业优先级排序
内容的提问来源于stack exchange,提问作者Lisa Write
相关产品推荐
相关产品推荐

