Collected posts: Oracle, SQL, PL/SQL, Performance, Security...(More than 300 blogs)

samedi 24 décembre 2011

ORA-30926: unable to get a stable set of rows in the source tables

J'ai eu ce message suite à une requête de merge:


 MERGE INTO events_last a
  USING   events  b
    ON (a.event =b.event)
  WHEN MATCHED THEN
    UPDATE SET a.date_event = b.date_event
  WHEN NOT MATCHED THEN
    INSERT (event, date_event)
    VALUES (b.event, b.date_event);

le contenu de table  events et events_last est le suivant:
select date_event, event from events order by  event;
 select date_event, event from events_last order by  event desc ;

Le problème provient de la jointure entre les deux tables events_last et events qui retourne plus qu'une ligne pour le même event , donc pour résoudre le problème, je propose la solution suivante :

MERGE INTO events_last a  USING ( select max(date_event) date_event,event from  events group by event ) b    ON (a.event =b.event)  WHEN MATCHED THEN    UPDATE SET a.date_event = b.date_event  WHEN NOT MATCHED THEN    INSERT (event, date_event)    VALUES (b.event, b.date_event);



Juste une remarque la solution dépend de votre besoin, pour ne pas avoir cet erreur, il suffit de s'assurer que la jointure entre les deux tables ne retourne pas plus qu'une ligne en appliquant les clauses dans le bloc ON comme dans notre cas (a.event =b.event).