Oracle SQL报错ORA-00923:如何获取指定日期前的所有日期
问题与解决方案
问题描述
原本使用以下子查询可获取Test_NAME=1且日期≤'18Dec2022'的最大日期:
(SELECT MAX("tn".DATE) FROM A.Test_Name "tn" WHERE "tn".Test_NAME = 1 AND "tn".Date <= '18Dec2022')
现需获取该条件下的所有日期,尝试执行以下子查询时抛出ORA-00923: FROM keyword not found where expected错误:
(SELECT "tn".DATE FROM A.Test_Name "tn" WHERE "tn".Test_NAME = 1 AND "tn".Date <= '18Dec2022')
该查询用于JOIN场景,原JOIN语句为:
JOIN A.Test_Name tn ON tn.Test_Name = 1 AND tn.DATE = (SELECT MAX("tn".DATE) FROM A.Test_Name "tn" WHERE "tn".Test_NAME = 1 AND "tn".Date <= '18Dec2022')
错误原因分析
- 语法位置错误:单独执行子查询时无需外层括号,多余的括号会导致Oracle解析语法出错。
- 匹配逻辑冲突:原JOIN中使用
=匹配子查询结果,但新子查询返回多个日期值,=仅支持匹配单个值,强行保留会引发逻辑错误。 - 关键字风险:
DATE是Oracle保留关键字,虽用双引号包裹可识别,但需确保双引号内字段名大小写与实际表结构完全一致(Oracle带双引号的标识符区分大小写)。
解决方案
方案1:直接修改JOIN条件(最简方式)
无需子查询,直接在JOIN的ON子句中加入日期过滤条件,即可关联所有符合要求的记录:
JOIN A.Test_Name tn ON tn.Test_Name = 1 AND tn.DATE <= '18Dec2022'
方案2:使用IN匹配多值子查询
若需通过子查询筛选日期再关联,将原=替换为IN(支持匹配多个返回值):
JOIN A.Test_Name tn ON tn.Test_Name = 1 AND tn.DATE IN ( SELECT tn_sub.DATE FROM A.Test_Name tn_sub WHERE tn_sub.Test_NAME = 1 AND tn_sub.Date <= '18Dec2022' )
单独执行子查询的正确写法
去掉外层括号,直接执行:
SELECT "tn".DATE FROM A.Test_Name "tn" WHERE "tn".Test_NAME = 1 AND "tn".Date <= '18Dec2022'
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

