You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

修正细节说明

  1. 给两个子查询明确加上AS别名,并通过JOIN ... ON关联A和B,解决了语法缺失的核心问题
  2. 修正了字段名错误,确保A和B的字段别名匹配
  3. 简化了GROUP BY子句,去掉了冗余的G.ABSENCE_YEAR_WID,让查询更高效
  4. 调整了括号嵌套结构,让整个SQL的逻辑层次更清晰,避免解析错误

内容的提问来源于stack exchange,提问作者Nishant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:47:38