Oracle
 sql >> Baza danych >  >> RDS >> Oracle

scalanie aktualizacji oracle nie może uzyskać stabilnego zestawu wierszy

Pokażę, jakie jest źródło tego błędu.
Rozważ poniższy prosty przykład:

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;

Teraz rozważ to połączenie:

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 |

powyższe zapytanie daje jeden unikalny rekord z tabeli B_100 . Jeśli użyjesz tego warunku dołączenia w instrukcji merge, scalenie zostanie przeprowadzone bez żadnego błędu:

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. 

Teraz rozważ poniższe połączenie:

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 | 

Powyższe złącze dla jednego rekordu z A_100 daje dwa rekordy z B_100 .

Jeśli spróbujesz użyć MERGE z powyższym warunkiem dołączenia, otrzymasz:

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 po prostu mówi:

Zapytanie o jeden rekord z lewej tabeli zwróciło dwie wartości:2000 i 3000 z prawej tabeli.
Nie mogę przypisać dwóch wartości z prawej tabeli do jednego pola skalarnego z lewej tabeli, jest to niemożliwe.
Proszę zmienić warunek złączenia tak, aby dla każdego z nich dawał tylko jeden unikalny rekord z prawej tabeli zapis w lewej tabeli




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle getConnection wolno

  2. Przyspiesz to_sql() podczas zapisywania Pandas DataFrame do bazy danych Oracle przy użyciu SqlAlchemy i cx_Oracle

  3. Jak uzyskać ostatni dzień miesiąca w Oracle?

  4. Napraw błąd „ORA-01789:blok zapytania ma nieprawidłową liczbę kolumn wyników”

  5. ORA-01017 Wskazówki dotyczące rozwiązywania błędów Oracle