Oracle SQL报错ORA-00923:预期位置未找到FROM关键字求助
错误原因排查与修正方案
核心错误点
误用保留关键字作为列别名:
你在SELECT语句末尾将统计列命名为from,而FROM是Oracle的保留关键字,不能直接用作列别名,这导致SQL解析器逻辑混乱,触发ORA-00923错误。子查询列别名错误添加表前缀:
子查询中case表达式的别名写成了h.reviewed_date,列别名不需要添加表前缀,正确写法应为reviewed_date。GROUP BY子句引用无效表别名:
外层查询的数据源是子查询my_records,不存在h表的直接引用,因此GROUP BY里的h.reviewed_date需改为my_records.reviewed_date(或直接写reviewed_date)。
修正后的完整代码
SELECT my_records.my_date, my_records.reviewed_date, COUNT(CASE WHEN my_records.reviewed = 'Y' THEN 1 ELSE NULL END) AS reviewed_count, COUNT(CASE WHEN my_records.approved = 'Y' THEN 1 ELSE NULL END) AS approved_count, COUNT(CASE WHEN my_records.approved = 'N' THEN 1 ELSE NULL END) AS rejected_count FROM ( SELECT h.id, CASE WHEN :P43_DATE_RANGES = 'Monthly' THEN TO_CHAR(h.reviewed_date, 'Month') WHEN :P43_DATE_RANGES = 'Daily' THEN TO_CHAR(h.reviewed_date, 'MM/DD/YYYY') WHEN :P43_DATE_RANGES = 'Weekly' THEN TO_CHAR(TRUNC(h.reviewed_date, 'IW'), 'MM/DD/YYYY') END AS my_date, CASE WHEN :P43_DATE_RANGES = 'Monthly' THEN TRUNC(date_sys, 'MM') WHEN :P43_DATE_RANGES = 'Daily' THEN TRUNC(date_sys) WHEN :P43_DATE_RANGES = 'Weekly' THEN TRUNC(date_sys, 'IW') END AS reviewed_date, h.reviewed, h.approved FROM INGESTED i LEFT OUTER JOIN highlighted h ON i.id = h.id_ingested WHERE h.reviewed_date BETWEEN TO_DATE(:P43_START_DATE) AND TO_DATE(:P43_END_DATE) ) my_records GROUP BY my_records.my_date, my_records.reviewed_date
补充说明
- 将原非法别名
from替换为有业务意义的名称(如rejected_count),规避保留关键字冲突; - 移除子查询列别名的表前缀,保证语法合法性;
- 外层GROUP BY统一使用子查询别名
my_records引用列,避免表别名混淆。
内容的提问来源于stack exchange,提问作者SunnyDays
相关产品推荐
相关产品推荐

