对同一张表执行UNION操作后,如何让第一个查询结果排在顶部?
解决UNION后TEST类型结果置顶的问题
问题原因
UNION操作本身不保证结果的顺序,数据库会根据执行计划自行优化排序逻辑,所以你写的第一个查询结果不会固定排在顶部。而且第二个查询已经包含了第一个查询的所有结果,用UNION只会自动去重,但依然无法控制顺序。
解决方案
方案1:添加排序权重字段(高效无重复)
给两个查询分别标记排序优先级,同时让第二个查询排除TYPE='TEST'的记录,避免重复数据,最后按优先级排序:
SELECT *, 1 AS sort_order FROM table1 WHERE tl='AAA' AND FT='ABC' AND DATE='04-MAY-23 11:07:00' AND TYPE='TEST' UNION ALL SELECT *, 2 AS sort_order FROM table1 WHERE tl='AAA' AND FT='ABC' AND DATE='04-MAY-23 11:07:00' AND TYPE != 'TEST' ORDER BY sort_order
UNION ALL比UNION更高效,因为不需要做去重检查sort_order=1的记录会始终排在sort_order=2的前面
方案2:子查询+条件排序(无需修改WHERE条件)
如果不想调整第二个查询的筛选条件,也可以用子查询合并结果后,根据TYPE字段做条件排序:
SELECT * FROM ( SELECT * FROM table1 WHERE tl='AAA' AND FT='ABC' AND DATE='04-MAY-23 11:07:00' AND TYPE='TEST' UNION SELECT * FROM table1 WHERE tl='AAA' AND FT='ABC' AND DATE='04-MAY-23 11:07:00' ) combined_results ORDER BY CASE WHEN TYPE='TEST' THEN 1 ELSE 2 END
这里UNION会自动去重,外层通过CASE表达式把TYPE='TEST'的记录优先级设为1,强制排在顶部。
内容的提问来源于stack exchange,提问作者marshmellow
相关产品推荐
相关产品推荐

