Oracle
 sql >> Database >  >> RDS >> Oracle

merge update Oracle non è in grado di ottenere un set stabile di righe

Mostrerò qual è l'origine di questo errore.
Considera il semplice esempio seguente:

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;

Ora, per favore, considera questo join:

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 query precedente fornisce un record univoco dalla tabella B_100 . Se utilizzi questa condizione di unione in un'istruzione di unione, l'unione verrà eseguita senza alcun errore:

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. 

Ora per favore considera il seguente join:

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 | 

L'unione sopra, per un record da A_100 fornisce due record da B_100 .

Se provi a utilizzare MERGE con la condizione di unione sopra, otterrai quanto segue:

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 ti dice semplicemente :

La query per un record dalla tabella di sinistra ha restituito due valori:2000 e 3000 dalla tabella di destra.
Non posso assegnare due valori dalla tabella di destra a un singolo campo scalare della tabella di sinistra, questo è impossibile.
Si prega di modificare la condizione di join in modo che fornisca un solo record unico dalla tabella di destra per ogni record nella tabella di sinistra