ORA-30926:使用另一个数据库中的另一个表更新数据库中的表时,无法在源表中获取稳定的行集

问题描述 投票:0回答:1

我正在尝试使用另一个数据库中的另一个表来更新数据库中的表。这个脚本一直工作正常,直到最近我开始收到错误:ORA-30926:无法在源表中获取稳定的行集。

请找到下面的脚本。

MERGE INTO VANTAGEDB.CERT_UPLOAD A USING (SELECT PERSONNEL_ID,SURNAME,FORENAMES,BIRTH_DATE FROM PERSONNEL@ORA12C_TO_POBM WHERE MIKE'PORTAL_VANTAGE%') B ON (A.SURNAME = B.SURNAME AND A.FORENAMES=B.FORENAMES AND A. BIRTH_DATE=B.BIRTH_DATE) 当匹配时更新集合 A.PERSONNEL_ID =B.PERSONNEL_ID WHERE NOT REGEXP_LIKE(PERSONNEL_ID, '^[[:digit:]]+$') 并且 CERT_STATUS 为 NULL;

我单独运行了这些嵌入式脚本,它们工作得很好。请问我该怎么办?

merge oracle-sqldeveloper insert-update
1个回答
0
投票

(这无法放入注释中,并且我无法在那里格式化代码)。

显然,

select surname, forename, birth_date 
from personnel 
group by surname, forename, birth_date 
having count(*) > 1;

返回一些重复项。

这就是问题的原因,因为您在将目标表 (

CERT_UPLOAD
) 连接到源数据集(子查询)时使用了这 3 列。由于存在重复项,Oracle 不知道该取哪个
PERSONNEL_ID

例如,如果

cert_upload
包含

surname forename birth_date personnel_id
------- -------- ---------- ------------
White   Mike     10.01.2020       (NULL)

并返回子查询

surname forename birth_date personnel_id
------- -------- ---------- ------------ 
White   Mike     10.01.2020          100
White   Mike     10.01.2020          992

哪个人员_id(100或992)应放入

cert_upload
表中?我不知道,Oracle也不知道。

这意味着您必须包含额外的列来唯一标识每一行,以便连接为 1:1。

© www.soinside.com 2019 - 2024. All rights reserved.