UNION联合查询中ORDER BY使用表别名报错的原因探究
为什么UNION合并查询后用表别名排序会报错?
核心原因是UNION的执行逻辑导致子查询的表别名无法作用到外层ORDER BY:
- 单个SELECT语句里的表别名
t,只在当前SELECT的范围内有效。比如单独执行SELECT ... FROM test t WHERE ... ORDER BY t.Profit时,t直接对应test表,排序时自然能识别。 - 但用UNION时,数据库会先分别执行两个子查询,将结果合并成一个全新的临时结果集,这个结果集不绑定任何原表的别名。外层的ORDER BY是直接作用在这个合并后的结果集上,子查询里的
t别名在合并完成后就失效了,所以写t.Profit会提示找不到对应的表/别名。 - 直接写
Profit能正常运行,是因为合并后的结果集保留了这个列名,ORDER BY可以直接引用结果集中的列名。
如果一定要用别名排序,可以把整个UNION查询嵌套成子查询,给这个子查询加别名,比如:
SELECT * FROM ( SELECT Company_code, operating_year, Profit FROM test WHERE Company_code = 'A' UNION SELECT Company_code, operating_year, Profit FROM test WHERE Company_code = 'B' ) AS t ORDER BY t.Profit;
这里的t是整个合并结果集的别名,外层ORDER BY就能正常识别了。
内容的提问来源于stack exchange,提问作者A Soutter
相关产品推荐
相关产品推荐

