SELECT用*时ORDER BY能否获取列名?该行为是否有文档说明?
问题解答:SELECT使用
*时ORDER BY子句能否引用列名 这种行为取决于查询类型,Oracle官方文档对此有明确规定,具体如下:
两种场景的差异分析
1. 单表简单查询(可正常运行)
当查询是直接从单表/视图获取数据的SELECT *简单查询时,ORDER BY可以直接引用原表的列名,比如你给出的代码:
select * from dual order by dummy
原因是Oracle解析这类查询时,会直接将*展开为表的所有列,ORDER BY子句能直接识别原表的列名。
2. 包含集合操作的复合查询(无法运行)
当查询包含UNION ALL这类集合操作时,SELECT *生成的是联合后的匿名结果集,此时ORDER BY不能直接引用原表的列名,比如报错的代码:
select * from dual union all select * from dual order by dummy
原因是联合查询的结果集属于临时结果,Oracle不会将原表列名关联到这个结果集上,必须使用列的位置索引,或者给列指定别名后通过别名引用。
官方文档说明
Oracle官方SQL语言参考明确指出:
在包含UNION、UNION ALL、INTERSECT、MINUS这类集合操作的查询中,
ORDER BY子句只能引用结果集列的位置,或者SELECT列表中为列指定的别名。如果SELECT列表使用*,无法直接引用原表列名——即使所有分支查询的列名完全一致,Oracle的解析逻辑也要求使用位置或别名来排序。
而单表SELECT *查询的ORDER BY可以直接用原表列名,是因为*会被直接展开为表的列,查询的列名就是原表列名。
内容的提问来源于stack exchange,提问作者ESkri
相关产品推荐
相关产品推荐

