sql >> Base de Datos >  >> RDS >> Oracle

fusionar actualizar oráculo incapaz de obtener un conjunto estable de filas

Voy a mostrar cuál es la fuente de este error.
Considere el siguiente ejemplo simple:

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;

Ahora por favor considere esta unión:

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 consulta anterior da un registro único de la tabla B_100 . Si usa esta condición de combinación en una instrucción de combinación, la combinación se ejecutará sin ningún error:

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. 

Ahora, por favor considere unirse a continuación:

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 unión anterior, para un registro de A_100 da dos registros de B_100 .

Si intenta utilizar MERGE con la condición de unión anterior obtendrá lo siguiente:

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 simplemente te dice:

La consulta de un registro de la tabla de la izquierda devolvió dos valores:2000 y 3000 de la tabla de la derecha.
No puedo asignar dos valores de la tabla de la derecha a un solo campo escalar de la tabla de la izquierda, esto es imposible.
Cambie la condición de combinación para que proporcione solo un registro único de la tabla de la derecha para cada registro en la tabla de la izquierda