sql >> Database >  >> RDS >> Oracle

merge update oracle kan geen stabiele set rijen krijgen

Ik ga laten zien wat de oorzaak van deze fout is.
Beschouw het onderstaande eenvoudige voorbeeld:

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;

Overweeg nu alsjeblieft om mee te doen:

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 |

de bovenstaande query geeft één uniek record uit de tabel B_100 . Als u deze join-voorwaarde in een merge-statement gebruikt, wordt de merge zonder fouten uitgevoerd:

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. 

Overweeg nu de onderstaande 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 | 

De bovenstaande join, voor één record van A_100 geeft twee records van B_100 .

Als je MERGE probeert te gebruiken met de bovenstaande join-voorwaarde, krijg je het volgende:

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 zegt gewoon:

De query voor één record uit de linkertabel heeft twee waarden geretourneerd:2000 en 3000 uit de rechtertabel.
Ik kan geen twee waarden uit de rechtertabel toewijzen aan een enkel scalair veld van de linkertabel, dit is onmogelijk.
Wijzig de join-voorwaarde zodat deze slechts één uniek record uit de rechtertabel voor elke opnemen in de linkertabel




  1. Overzicht van server-side programmering in PostgreSQL

  2. Hoe gegevens exporteren met Oracle SQL Developer?

  3. Waarom heeft een Oracle plsql varchar2-variabele een grootte nodig, maar een parameter niet?

  4. Hoe MySQL-databases in de opdrachtregel te importeren