加入 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。 看来违规条件不应该出现在merge
的using
子句中最后一个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 命令未正确结束”错误''