sql >> Databasteknik >  >> RDS >> Oracle

merge update oracle kan inte få en stabil uppsättning rader

Jag ska visa vad källan till detta fel är.
Tänk på nedanstående enkla exempel:

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;

Överväg nu att gå med:

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 |

ovanstående fråga ger en unik post från tabellen B_100 . Om du använder detta sammanfogningsvillkor i en sammanslagningssats, kommer sammanslagningen att köras utan något fel:

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. 

Tänk nu på att gå med nedan:

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 | 

Ovanstående ansluter, för en post från A_100 ger två poster från B_100 .

Om du försöker använda MERGE med ovanstående anslutningsvillkor får du följande:

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 säger bara att du:

Frågan för en post från den vänstra tabellen returnerade två värden:2000 och 3000 från den högra tabellen.
Jag kan inte tilldela två värden från den högra tabellen till ett enda skalärt fält i den vänstra tabellen, detta är omöjligt.
Ändra kopplingsvillkoret så att det bara ger en unik post från den högra tabellen för varje spela in i den vänstra tabellen




  1. SQL Server JDBC-fel på Java 8:Drivrutinen kunde inte upprätta en säker anslutning till SQL Server genom att använda Secure Sockets Layer (SSL) kryptering

  2. Bästa metoder för skalning av databaser:Del 1

  3. Brott mot UNIQUE KEY-begränsning på INSERT WHERE COUNT(*) =0 på SQL Server 2005

  4. konvertera MySQL SET-datatypen till Postgres