今天写sql突然报错:
Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-01791: 不是 SELECTed 表达式
SELECT DISTINCT
menu.SYS_MENU_ID,
menu.MENU_NAME,
menu.MENU_CODE,
menu.PARENT_MENU_ID,
menu.MENU_URL,
menu.MENU_ROAD,
res.SYS_RESOURCE_ID,
res.RESC_TYPE
FROM
SYS_MENU menu
LEFT JOIN SYS_RESOURCE res ON menu.SYS_MENU_ID = res.SYS_MENU_ID
AND res.RESC_TYPE = 'MENU'
LEFT JOIN SYS_RESC_PRMSN_CONTRL c ON res.SYS_RESOURCE_ID = c.SYS_RESOURCE_ID
AND c.TARGET_TYPE = 'ROLE'
AND c.TARGET_ID IN ( '1405365037018644481', '1405365037018644482' )
WHERE
menu.SYS_MENU_ID NOT IN ( '1', '3', '4' )
AND menu.IS_VALID = '1'
AND menu.MENU_GROUP = '1'
AND c.RESC_STATUS = '1'
ORDER BY
menu.SORT_NO ASC
现象:
1.去掉 ORDER BY menu.SORT_NO ASC
或 DISTINCT
以后发现能正常查询,得出DISTINCT不能和order by一起使用
分析原因:
首先,distinct的执行顺序高于order by。
第二,distinct执行时会对查询的记录进行去重,产生一张虚拟的临时表;
第三,order by执行时对查询的虚拟临时表进行排序,产生新的虚拟临时表。
综合来看,如果order by的字段不在select中,执行sql语句时首先执行distinct,之后产生的虚拟临时表中没有order by的字段,所以再执行order by时会报错。
解决:
在sql的查询字段中添加排序的字段即可