ORACLE 报错 ORA-01791:不是SELECTed表达式,但是再嵌套一层就不会报错,求学长学姐们告知原理
代码1:
SELECT DISTINCT AAA
FROM (SELECT 'aaa' AAA ,1 NNN FROM DUAL
UNION
SELECT 'bbb' AAA ,2 NNN FROM DUAL)
ORDER BY NNN
代码2:
SELECT *
FROM (SELECT DISTINCT AAA
FROM (SELECT 'aaa' AAA ,1 NNN FROM DUAL
UNION
SELECT 'bbb' AAA ,2 NNN FROM DUAL)
ORDER BY NNN)
ORDER BY AAA
代码1报错内容:
代码2运行结果:
百度之后,我能理解为什么代码1报错,但是不太明白代码2为什么不报错;
对于代码2不报错的原因,我只能先粗浅理解为:内层order by 的字段只要是表中存在的字段,sql编译的时候就能通过编译,而实际执行时,当外层sql语句已经有order by后,就不会再去执行子查询的order by了,或者子查询的order by语句直接就会被数据库的优化器过滤、忽略掉