Oracle 18c查询列存在仍报n.stage_code无效标识符错误
问题背景
- 数据库版本:Oracle 18c
- 已执行的建表及测试数据插入SQL如下:
create table test_tab1( seq_id NUMBER(10), e_id NUMBER(10), jira_key VARCHAR2(20), stage_code NUMBER(10) ); INSERT INTO test_tab1 VALUES(1,11,'JIRA_A',2); INSERT INTO test_tab1 VALUES(2,12,'JIRA_B',3); COMMIT; create table test_tab2( seq_id NUMBER(10), e_id NUMBER(10), jira_key VARCHAR2(20), stage_code NUMBER(10) );
问题现象
执行以下包含WITH公共表达式、FULL JOIN...USING语法的查询语句时,抛出n.stage_code invalid identifier(n.stage_code为无效标识符)错误:
WITH got_new_code AS ( SELECT m.e_id,m.jira_key , m.stage_code AS new_code , c.code FROM test_tab1 m CROSS APPLY ( SELECT LEVEL - 1 AS code FROM dual CONNECT BY LEVEL <= m.stage_code + 1 ) c WHERE m.stage_code IS NOT NULL ORDER BY m.e_id,m.stage_code ) SELECT * FROM got_new_code n FULL JOIN test_tab2 t USING (e_id,jira_key,stage_code);
错误产生原因
报错的核心原因是WITH子句定义的got_new_code结果集中不存在stage_code字段:
- 查看CTE内部的SELECT逻辑,源表
test_tab1的stage_code字段被显式重命名为new_code,最终CTE输出的列只有4个:e_id、jira_key、new_code、code,没有名为stage_code的列。 FULL JOIN ... USING (关联字段列表)语法的使用规则是:括号内声明的关联字段必须同时存在于左右两个关联结果集中,且字段名完全一致。该查询的USING子句中声明了stage_code作为关联列,但左侧别名n对应的CTE结果集没有这个同名字段,数据库解析SQL时找不到对应标识符,就会抛出该错误。
补充说明:CTE内部编写的ORDER BY子句没有实际业务意义,Oracle不会保证CTE返回结果的顺序,需要对最终结果排序时,要在最外层查询添加ORDER BY子句。
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

