Oracle
 sql >> Base de données >  >> RDS >> Oracle

merge update oracle incapable d'obtenir un ensemble stable de lignes

Je vais montrer quelle est la source de cette erreur.
Considérez l'exemple simple ci-dessous :

CREATE TABLE A_100(
  x_system int,
  val int
);

INSERT INTO a_100 values( 1, 100 );
INSERT INTO a_100 values( 2, 200 );

CREATE TABLE B_100(
  x_system int,
  val int
);

INSERT INTO b_100 values( 1, 1100 );
INSERT INTO b_100 values( 2, 2000 );
INSERT INTO b_100 values( 2, 3000 );

commit;

Maintenant, veuillez considérer cette jointure :

SELECT *
FROM A_100 a
JOIN B_100 b
ON a.x_system = b.x_system AND a.x_system = 1
;

| X_SYSTEM | VAL | X_SYSTEM |  VAL |
|----------|-----|----------|------|
|        1 | 100 |        1 | 1100 |

la requête ci-dessus donne un enregistrement unique de la table B_100 . Si vous utilisez cette condition de jointure dans une instruction de fusion, la fusion s'exécutera sans erreur :

MERGE INTO A_100 a
USING B_100 b
ON ( a.x_system = b.x_system AND a.x_system = 1)
WHEN MATCHED THEN UPDATE SET a.val = b.val
;

1 row merged. 

Veuillez maintenant considérer la jointure ci-dessous :

SELECT *
FROM A_100 a
JOIN B_100 b
ON a.x_system = b.x_system AND a.x_system = 2
;

| X_SYSTEM | VAL | X_SYSTEM |  VAL |
|----------|-----|----------|------|
|        2 | 200 |        2 | 2000 |
|        2 | 200 |        2 | 3000 | 

La jointure ci-dessus, pour un enregistrement de A_100 donne deux enregistrements de B_100 .

Si vous essayez d'utiliser MERGE avec la condition de jointure ci-dessus, vous obtiendrez ce qui suit :

MERGE INTO A_100 a
USING B_100 b
ON ( a.x_system = b.x_system AND a.x_system = 2)
WHEN MATCHED THEN UPDATE SET a.val = b.val
;

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

Oracle vous dit simplement :

La requête pour un enregistrement de la table de gauche a renvoyé deux valeurs :2000 et 3000 de la table de droite.
Je ne peux pas affecter deux valeurs de la table de droite à un seul champ scalaire de la table de gauche, c'est impossible.
Veuillez modifier la condition de jointure afin qu'elle ne donne qu'un seul enregistrement unique de la table de droite pour chaque enregistrer dans le tableau de gauche