Oracle使用INSERT INTO SELECT跨表插入数据报ORA-00926错误
问题原因
ORA-00926是Oracle抛出的SQL语法缺失错误,你编写的INSERT语句存在两处不符合Oracle语法规范的问题,同时存在逻辑错误:
- 语法错误1:在INSERT语句的目标字段列表闭合括号后,错误给目标表加了别名
A。INSERT INTO子句的目标对象不支持在字段列表后直接声明别名,该位置出现多余标识符会直接触发语法校验失败。 - 语法错误2:给后续的SELECT查询语句额外包裹了一层不必要的圆括号,不符合
INSERT INTO ... SELECT的标准语法结构。 - 逻辑错误:WHERE条件中引用的
A.ID_BASE属于未在SELECT查询块内定义的对象——INSERT操作是将SELECT返回的结果集写入目标表,SELECT执行阶段本次要插入的数据还未进入目标表,无法直接通过别名关联目标表做字段匹配。
修正方案
场景1:全量插入源表所有对应字段数据
如果你的需求是把源视图中所有记录的指定字段全量插入目标视图,不需要做匹配判断,直接去掉多余别名和括号即可,正确SQL如下:
INSERT INTO TABLEROS.V_GRR_EEAF ( PER_ID, EDAD, F_NACIMIENTO, CICLO_VITAL, GENERO_HOM, PERT_ETNICA, DISCAP ) SELECT PER_ID, EDAD, F_NACIMIENTO, CICLO_VITAL, GENERO_HOM, PERT_ETNICA, DISCAP FROM FUENTES.V_GRR_EEAF@CONSULTAFUENTES80;
场景2:仅插入目标表中不存在对应ID_BASE的记录
如果你加A.ID_BASE = B.ID_BASE的目的是跳过目标表已存在同ID_BASE的重复数据,需要通过NOT EXISTS子句在SELECT块内显式关联目标表做判断,正确写法如下:
INSERT INTO TABLEROS.V_GRR_EEAF ( PER_ID, EDAD, F_NACIMIENTO, CICLO_VITAL, GENERO_HOM, PERT_ETNICA, DISCAP ) SELECT B.PER_ID, B.EDAD, B.F_NACIMIENTO, B.CICLO_VITAL, B.GENERO_HOM, B.PERT_ETNICA, B.DISCAP FROM FUENTES.V_GRR_EEAF@CONSULTAFUENTES80 B WHERE NOT EXISTS ( SELECT 1 FROM TABLEROS.V_GRR_EEAF A WHERE A.ID_BASE = B.ID_BASE );
注意事项
你当前写入的对象TABLEROS.V_GRR_EEAF是视图而非物理表,执行插入前请确认:
- 该视图为可更新视图,没有设置INSTEAD OF触发器之外的写入限制
- 你持有该视图对应的插入权限
内容的提问来源于stack exchange,提问作者TrueAFM
相关产品推荐
相关产品推荐

