sql >> Database teknologi >  >> RDS >> Oracle

flette opdatering oracle ude af stand til at få et stabilt sæt rækker

Jeg vil vise, hvad kilden til denne fejl er.
Overvej nedenstående enkle eksempel:

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;

Overvej nu venligst denne deltagelse:

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 |

ovenstående forespørgsel giver én unik post fra tabellen B_100 . Hvis du bruger denne sammenføjningsbetingelse i en flettesætning, vil fletningen køre uden nogen fejl:

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. 

Overvej nu venligst nedenstående deltagelse:

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 | 

Ovenstående slutter sig til, for én registrering fra A_100 giver to poster fra B_100 .

Hvis du forsøger at bruge MERGE med ovenstående deltagelsesbetingelse, får du følgende:

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 siger blot dig:

Forespørgslen for én post fra den venstre tabel returnerede to værdier:2000 og 3000 fra den højre tabel.
Jeg kan ikke tildele to værdier fra den højre tabel til et enkelt skalarfelt i den venstre tabel, dette er umuligt.
Ændr venligst join-betingelsen, så den kun giver én unik post fra den højre tabel for hver optag i den venstre tabel




  1. Sådan tilføjes automatisk stigningskolonne i eksisterende tabel i MySQL

  2. Oracle får kontrolsumværdi for en datachunk defineret af en select-klausul

  3. Tilføjelse af skemanavn til enhed i Spring-data?

  4. Pivot i Oracle 11g