sql >> Databáze >  >> RDS >> Oracle

merge update oracle nedokáže získat stabilní sadu řádků

Ukážu, jaký je zdroj této chyby.
Zvažte níže uvedený jednoduchý příklad:

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;

Nyní prosím zvažte toto připojení:

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 |

výše uvedený dotaz poskytuje jeden jedinečný záznam z tabulky B_100 . Pokud použijete tuto podmínku spojení v příkazu sloučení, sloučení proběhne bez jakékoli chyby:

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. 

Nyní zvažte níže uvedené připojení:

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 | 

Výše uvedené spojení pro jeden záznam z A_100 dává dva záznamy z B_100 .

Pokud se pokusíte použít MERGE s výše uvedenou podmínkou připojení, získáte následující:

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 vám jednoduše říká:

Dotaz na jeden záznam z levé tabulky vrátil dvě hodnoty:2000 a 3000 z pravé tabulky.
Nemohu přiřadit dvě hodnoty z pravé tabulky k jedinému skalárnímu poli levé tabulky, to je nemožné.
Změňte prosím podmínku spojení tak, aby pro každou poskytla pouze jeden jedinečný záznam z pravé tabulky záznam v levé tabulce




  1. Využití mezipaměti contrib's pg_prewarm a pg_hibernator v PostgreSQL 9.4.

  2. SUBDATE() vs DATE_SUB() v MySQL:Jaký je rozdíl?

  3. Vícenásobná funkce REPLACE v Oracle

  4. Instalace Oracle 12c Standard Edition na Windows 10 Professional