Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Merge-Update-Orakel kann keinen stabilen Satz von Zeilen erhalten

Ich werde zeigen, was die Quelle dieses Fehlers ist.
Betrachten Sie das folgende einfache Beispiel:

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;

Betrachten Sie nun bitte diesen 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 |

Die obige Abfrage ergibt einen eindeutigen Datensatz aus der Tabelle B_100 . Wenn Sie diese Join-Bedingung in einer Merge-Anweisung verwenden, wird die Zusammenführung ohne Fehler ausgeführt:

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. 

Betrachten Sie nun bitte den folgenden 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 | 

Der obige Join für einen Datensatz aus A_100 gibt zwei Datensätze von B_100 .

Wenn Sie versuchen, MERGE mit der obigen Verknüpfungsbedingung zu verwenden, erhalten Sie Folgendes:

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 sagt Ihnen einfach :

Die Abfrage für einen Datensatz aus der linken Tabelle hat zwei Werte zurückgegeben:2000 und 3000 aus der rechten Tabelle.
Ich kann nicht zwei Werte aus der rechten Tabelle einem einzelnen Skalarfeld der linken Tabelle zuweisen, das ist unmöglich.
Bitte ändern Sie die Join-Bedingung so, dass sie für jeden nur einen eindeutigen Datensatz aus der rechten Tabelle ergibt Eintrag in der linken Tabelle