加入 3 个表以更新和插入

Posted

技术标签:

【中文标题】加入 3 个表以更新和插入【英文标题】:Join 3 tables to update and insert 【发布时间】:2021-05-17 19:19:21 【问题描述】:

我正在尝试从 3 个表(B69_CAT_ALERTA_FILE、TBL_INTERLOCUTORES 和 B69_TBL_ALERTA 警报)中插入和更新数据到 B69_TBL_ALERTA_CONCENTRADO concentrado。 使用 2 INNER JOIN 它可以工作,但是将第三个表添加到它会失败。 它说无效的标识符 ID_ALERTA。 插入和更新没有问题,所以我不添加那个代码。

MERGE INTO B69_TBL_ALERTA_CONCENTRADO concentrado USING (
    SELECT
        inter.rfc as inter_rfc,
        alerta.id_alerta,
        archivo.id_archivo,
        archivo.rfc,
        archivo.nombre_contribuyente,
        archivo.situacion_contribuyente,
        archivo.oficio_global,
        archivo.publicacion_presuntos,
        archivo.publicacion_definitivos
    FROM
        B69_CAT_ALERTA_ARCHIVO archivo
        INNER JOIN TBL_INTERLOCUTORES inter ON inter.rfc = archivo.rfc
        INNER JOIN B69_TBL_ALERTA alerta ON concentrado.id_alerta = alerta.id_alerta
) v_using ON (concentrado.rfc = v_using.rfc)

错误

错误():PL / SQL:ORA-00904:“CONCENTRADO”。 “ID_ALERTA”:无效标识符

【问题讨论】:

您确定 concentrado.id_alerta 存在吗?这似乎是错误消息所暗示的内容。 是的,该字段确实存在于我试图关联的两个表中,实际上我试图通过 rfc 执行的操作也存在于两个表中,但它也不允许。 啊,我明白了这个问题,您不能在子查询中引用 concentrado,尝试在子查询中存在的 id 上加入 alerta。 看来违规条件不应该出现在mergeusing子句中最后一个join的on子句中。相反,它应该移动到 merge 语句本身的 on 子句,即您发布的代码的最后一行。 【参考方案1】:

请试试这个

MERGE INTO B69_TBL_ALERTA_CONCENTRADO concentrado USING (
    SELECT
        inter.rfc as inter_rfc,
        alerta.id_alerta,
        archivo.id_archivo,
        archivo.rfc,
        archivo.nombre_contribuyente,
        archivo.situacion_contribuyente,
        archivo.oficio_global,
        archivo.publicacion_presuntos,
        archivo.publicacion_definitivos
    FROM
        B69_CAT_ALERTA_ARCHIVO archivo
        INNER JOIN TBL_INTERLOCUTORES inter ON inter.rfc = archivo.rfc
        INNER JOIN B69_TBL_ALERTA alerta ON  alerta.id_alerta = inter.rfc 
) v_using ON (concentrado.rfc = v_using.rfc and concentrado.id_alerta = v_using.id_alerta)

【讨论】:

【参考方案2】:

   SELECT 1 FROM B69_TBL_ALERTA_CONCENTRADO concentrado JOIN (
        SELECT
            inter.rfc as inter_rfc,
            alerta.id_alerta,
            archivo.id_archivo,
            archivo.rfc,
            archivo.nombre_contribuyente,
            archivo.situacion_contribuyente,
            archivo.oficio_global,
            archivo.publicacion_presuntos,
            archivo.publicacion_definitivos
        FROM
            B69_CAT_ALERTA_ARCHIVO archivo
            INNER JOIN TBL_INTERLOCUTORES inter ON inter.rfc = archivo.rfc
            INNER JOIN B69_TBL_ALERTA alerta ON concentrado.id_alerta = alerta.id_alerta
    ) v_using ON (concentrado.rfc = v_using.rfc);

如果错了,你的表格匹配有问题,如果没有,你的MERGE有问题。

【讨论】:

以上是关于加入 3 个表以更新和插入的主要内容,如果未能解决你的问题,请参考以下文章

我试图通过加入 3 个表将值插入表中,但是我收到“ORA-00933:SQL 命令未正确结束”错误''

如何在2个表之间加入新表?

LINQ to SQL(基于3个表插入事实表)

比较 2 个配置单元表以查找没有任何唯一列/时间戳的更新/插入/删除记录并将其附加到 Hadoop 中的基表

插入一张多对多表并加入表休眠

SQL用触发器实现 2个表 数据关联,插入更新和删除?