Oracle SQL报错ORA-00936缺失表达式:匹配时长ID查询问题
修正你的Oracle SQL语法错误
我帮你排查了这个SQL的问题,核心是语法结构缺失和细节错误导致的ORA-00936,咱们一步步梳理并修正:
原SQL的主要错误点
- 缺少JOIN关键字:你定义完子查询A后,直接写了子查询B,中间没有加
JOIN关联关键字,这是触发“missing expression”的直接原因(对应报错的第5行第2列位置) - 字段名不匹配:你写的
B.HOURS_DURATION,但子查询B里的求和字段别名是HOURS_DUR,字段名写错了 - 子查询别名规范问题:Oracle里虽允许省略
AS定义别名,但加上AS会更清晰,同时原SQL的括号嵌套混乱,导致解析失败 - 冗余的GROUP BY字段:原SQL里GROUP BY包含了
G.ABSENCE_YEAR_WID,但WHERE已经过滤了单个年份(最大的ABSENCE_YEAR_WID),这个字段没必要出现在GROUP BY里
修正后的SQL
SELECT A.ID FROM ( -- 从EMP_PROVIDER关联员工表,获取每个员工的HOURS_DUR SELECT D.ID AS ID, F.HOURS_DUR AS HOURS_DUR FROM EMP_PROVIDER F JOIN WC_EMPLOYEE D ON D.ROW_WID = F.EMP_WID ) AS A JOIN ( -- 从ABSENCE_EVENT按员工分组,求和最新年份的请假时长总和 SELECT D.ID AS ID, SUM(G.HOURS_DUR) AS HOURS_DUR FROM ABSENCE_EVENT G JOIN WC_EMPLOYEE D ON G.EMPLOYEE_WID = D.ROW_WID WHERE G.ABSENCE_YEAR_WID = ( SELECT MAX(ABSENCE_YEAR_WID) FROM ABSENCE_EVENT ) GROUP BY D.ID ) AS B ON A.ID = B.ID WHERE A.HOURS_DUR <> B.HOURS_DUR;
修正细节说明
- 给两个子查询明确加上
AS别名,并通过JOIN ... ON关联A和B,解决了语法缺失的核心问题 - 修正了字段名错误,确保A和B的字段别名匹配
- 简化了GROUP BY子句,去掉了冗余的
G.ABSENCE_YEAR_WID,让查询更高效 - 调整了括号嵌套结构,让整个SQL的逻辑层次更清晰,避免解析错误
内容的提问来源于stack exchange,提问作者Nishant
相关产品推荐
相关产品推荐

