Oracle 19c多表查询插入报错:缺少右括号
问题分析与解决
原SQL的核心问题是子查询语法结构错误:你把两个独立的表查询强行塞到一个括号里,导致括号不匹配,同时字段输出逻辑混乱,无法对应目标表的3个列。
修正方案(根据业务逻辑选择)
方案1:两张表通过姓名关联查询
如果GL_TD_DECOUVERTE_RESA和GL_INDIVIDU中符合姓名条件的记录是一一对应的,用JOIN关联查询更高效:
INSERT INTO GL_TD_RESSEA (RESS_SEAID, RESS_CREAPAR, RESS_IDIND) SELECT d.ID, d.RESAD_CREAPAR, i.ID FROM GL_TD_DECOUVERTE_RESA d JOIN GL_INDIVIDU i ON UPPER(d.resad_PNOM) = UPPER(i.IND_PNOM) AND UPPER(d.RESAD_NOM) = UPPER(i.IND_NOM) WHERE UPPER(d.resad_PNOM) = UPPER(:P24_PRENOM_DU_DEMANDEUR) AND UPPER(d.RESAD_NOM) = UPPER(:P24_NOM_DU_DEMANDEUR);
方案2:分别从两张表取单条记录的字段
如果两个表的查询各自仅返回单条记录,可通过独立子查询获取每个字段:
INSERT INTO GL_TD_RESSEA (RESS_SEAID, RESS_CREAPAR, RESS_IDIND) SELECT (SELECT ID FROM GL_TD_DECOUVERTE_RESA WHERE UPPER(resad_PNOM) = UPPER(:P24_PRENOM_DU_DEMANDEUR) AND UPPER(RESAD_NOM) = UPPER(:P24_NOM_DU_DEMANDEUR)), (SELECT RESAD_CREAPAR FROM GL_TD_DECOUVERTE_RESA WHERE UPPER(resad_PNOM) = UPPER(:P24_PRENOM_DU_DEMANDEUR) AND UPPER(RESAD_NOM) = UPPER(:P24_NOM_DU_DEMANDEUR)), (SELECT ID FROM GL_INDIVIDU WHERE UPPER(IND_PNOM) = UPPER(:P24_PRENOM_DU_DEMANDEUR) AND UPPER(IND_NOM) = UPPER(:P24_NOM_DU_DEMANDEUR));
注意:这种写法要求每个子查询必须返回且仅返回1条记录,否则会抛出
单行子查询返回多个行的错误。
原SQL错误点拆解
- 外层SELECT后的括号内,错误将两个表的查询拼接在一起,导致括号不匹配,Oracle无法解析语法结构;
- 目标表需要3个字段,但原写法的子查询逻辑混乱,无法输出对应数量的有效字段。
内容的提问来源于stack exchange,提问作者Chipniz
相关产品推荐
相关产品推荐

