PL/SQL中使用CTE与Row Number函数遇ORA-00923错误的原因咨询
ORA-00923错误原因及修复方案
错误原因
你遇到的ORA-00923错误,核心原因是Oracle SQL不支持在SELECT子句中同时使用*通配符和显式定义的计算列。你的SQL第3行写了SELECT *, row_number()...,这种写法在部分数据库(如MySQL)中可行,但Oracle的语法规则不允许——在多表连接场景下,Oracle无法解析*后紧跟的额外列,因此抛出"FROM关键字未在预期位置出现"的错误。
修复后的SQL
将*替换为具体表的所有列(用表别名限定),示例如下:
WITH cte2 AS ( SELECT a.*, b.*, row_number() over (order by a.v_prt_nbr_spr) as rw_number FROM cf_active_pn_master a INNER JOIN cf_conn_support b ON a.obj_id = b.obj_id WHERE a.v_prt_nbr_spr LIKE 'HQCD%' ) SELECT * FROM cte2 where rw_number between 5000 and 10000;
如果不需要两个表的全部字段,更推荐明确列出需要的字段,既符合Oracle语法,也能提升查询效率:
WITH cte2 AS ( SELECT a.obj_id, a.v_prt_nbr_spr, -- 替换为你实际需要的a表字段 b.your_column1, b.your_column2, -- 替换为你实际需要的b表字段 row_number() over (order by a.v_prt_nbr_spr) as rw_number FROM cf_active_pn_master a INNER JOIN cf_conn_support b ON a.obj_id = b.obj_id WHERE a.v_prt_nbr_spr LIKE 'HQCD%' ) SELECT * FROM cte2 where rw_number between 5000 and 10000;
内容的提问来源于stack exchange,提问作者Vishal Mishr
相关产品推荐
相关产品推荐

