INSERT INTO WITH SELECT 和 WHERE(问题)

Posted

技术标签:

【中文标题】INSERT INTO WITH SELECT 和 WHERE(问题)【英文标题】:INSERT INTO WITH SELECT and WHERE (Problem) 【发布时间】:2021-03-22 15:05:33 【问题描述】:

我需要使用 select 执行插入,但 DBEAVER 返回以下错误:

SQL 错误 [904] [42000]:ORA-00904:“NR_CARTEIRA”:标识符无效

有谁知道它是什么?

INSERT INTO recem_nascido(
   DT_ATENDIMENTO ,
   CD_DECLARACAO_NASCIDO_VIVO,
   cd_atendimento,
   CD_MULTI_EMPRESA,
   cd_paciente,
   nm_paciente,
   CD_ATENDIMENTO_PAI,
   dt_nascimento,
   nm_mae,
   cd_convenio,
   NR_CARTEIRA )
SELECT
   a.DT_ATENDIMENTO ,
   c.CD_DECLARACAO_NASCIDO_VIVO,
   a.cd_atendimento,
   a.CD_MULTI_EMPRESA,
   a.cd_paciente,
   b.nm_paciente,
   a.CD_ATENDIMENTO_PAI,
   b.dt_nascimento,
   b.nm_mae,
   a.cd_convenio,
   a.NR_CARTEIRA
FROM
     DBAMV.ATENDIME a,
     dbamv.paciente b,
     dbamv.recem_nascido c
WHERE 
   a.CD_ATENDIMENTO = 33079344
   AND c.CD_DECLARACAO_NASCIDO_VIVO = 111
   AND A.NR_CARTEIRA = 321321321
   AND a.cd_atendimento_pai IS NOT NULL 
   AND a.CD_PACIENTE = b.CD_PACIENTE 
   AND c.CD_ATENDIMENTO = a.CD_ATENDIMENTO; ```

【问题讨论】:

首先猜测是您的目标表中没有名为NR_CARTEIRA 的列。 要改掉的坏习惯:using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 proper ANSI-92 SQL 标准中的 ANSI JOIN 语法(差不多 30 年前 前),不鼓励使用它 JOIN一起学习使用有意义的表别名。使用表格缩写而不是任意字母,查询更容易阅读。 而且可能需要 接下来的 30 年 才能使用 new-style 语法 safely everywhere 【参考方案1】:

只有两种选择:

    目标表recem_nascido 没有列NR_CARTEIRADBAMV.ATENDIME 没有列NR_CARTEIRA

由于您只发布了查询,而不是表结构,因此无法进一步缩小范围。

【讨论】:

以上是关于INSERT INTO WITH SELECT 和 WHERE(问题)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Insert into with select from multiple tables

结合 INSERT INTO 和 WITH/CTE

Oracle中insert into select和select into的区别

Oracle中insert into select和select into的区别

Oracle中insert into select和select into的区别

select into 和insert into select