Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

merge update oracle incapaz de obter um conjunto estável de linhas


Vou mostrar qual é a origem desse erro.
Considere o exemplo simples abaixo:
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;

Agora, por favor, considere esta junção:
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 |

a consulta acima fornece um registro exclusivo da tabela B_100 . Se você usar essa condição de junção em uma instrução de mesclagem, a mesclagem será executada sem nenhum erro:
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. 

Agora, considere a junção abaixo:
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 | 

A junção acima, para um registro de A_100 fornece dois registros de B_100 .

Se você tentar usar MERGE com a condição de junção acima, você obterá o seguinte:
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

A Oracle simplesmente diz que você:

A consulta de um registro da tabela da esquerda retornou dois valores:2000 e 3000 da tabela da direita.
Não consigo atribuir dois valores da tabela da direita para um único campo escalar da tabela da esquerda, isso é impossível.
Por favor, altere a condição de junção para que dê apenas um registro único da tabela da direita para cada registre na tabela à esquerda