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

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')

错误原因分析

  1. 语法位置错误:单独执行子查询时无需外层括号,多余的括号会导致Oracle解析语法出错。
  2. 匹配逻辑冲突:原JOIN中使用=匹配子查询结果,但新子查询返回多个日期值,=仅支持匹配单个值,强行保留会引发逻辑错误。
  3. 关键字风险: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:50:27