我正在尝试使用另一个数据库中的另一个表来更新数据库中的表。这个脚本一直工作正常,直到最近我开始收到错误: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;
我单独运行了这些嵌入式脚本,它们工作得很好。请问我该怎么办?
(这无法放入注释中,并且我无法在那里格式化代码)。
显然,
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。