I have this query to merge data from the individuals2 table. I still get the “unable to get a stable set of rows” error after deleting all the full_name
duplicates in individuals2. What am I missing?
x
MERGE INTO TBLHISTORYPERSON h
USING individuals2 i
ON (lower(i.FULL_NAME) = lower(h.FULL_NAME) AND
i.DOB = h.hDOB)
WHEN MATCHED THEN UPDATE
SET h.PERSON_ID = i.PERSON_ID
WHERE h.PERSON_ID IS null
Advertisement
Answer
Your problem might be in the lower(FULL_NAME)
expression in the join condition.
It is not enough that FULL_NAME
and DOB
are unique in the table individuals2
.
lower(FULL_NAME)
and DOB
must be unique
A small example
create table TBLHISTORYPERSON
(FULL_NAME varchar2(10),
hdob int,
person_id int);
insert into TBLHISTORYPERSON (FULL_NAME, hdob, person_id)
values ('Max',1,null);
create table individuals2
(FULL_NAME varchar2(10),
dob int,
person_id int);
insert into individuals2 (FULL_NAME, dob, person_id)
values ('Max',1,2);
insert into individuals2 (FULL_NAME, dob, person_id)
values ('max',1,3);
MERGE INTO TBLHISTORYPERSON h
USING individuals2 i
ON (lower(i.FULL_NAME) = lower(h.FULL_NAME) AND
i.DOB = h.hDOB)
WHEN MATCHED THEN UPDATE
SET h.PERSON_ID = i.PERSON_ID
WHERE h.PERSON_ID IS null
;
ORA-30926: unable to get a stable set of rows in the source tables
Remove one of the rows and it works
delete from individuals2 where full_name = 'Max';
1 row deleted.
The MERGE works
1 row merged.
Select * from TBLHISTORYPERSON;
FULL_NAME HDOB PERSON_ID
---------- ---------- ----------
Max 1 3