Oracle
 sql >> база данни >  >> RDS >> Oracle

merge update oracle не може да получи стабилен набор от редове

Ще покажа какъв е източникът на тази грешка.
Разгледайте прост пример по-долу:

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;

Сега, моля, помислете за това присъединяване:

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 |

горната заявка дава един уникален запис от таблицата B_100 . Ако използвате това условие за присъединяване в израз за сливане, сливането ще се извърши без грешка:

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. 

Сега, моля, помислете за присъединяването по-долу:

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 | 

Горното присъединяване за един запис от A_100 дава два записа от B_100 .

Ако се опитате да използвате MERGE с горното условие за присъединяване, ще получите следното:

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 просто ви казва:

Заявката за един запис от лявата таблица върна две стойности:2000 и 3000 от дясната таблица.
Не мога да присвоя две стойности от дясната таблица към едно скаларно поле на лявата таблица, това е невъзможно.
Моля, променете условието за присъединяване, така че да дава само един уникален запис от дясната таблица за всяка запис в лявата таблица




  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 със стойност на последователност?

  2. Как да дефинирате първичен ключ за автоматично увеличение в Oracle

  3. Как можете да разберете дали дадена стойност не е числова в Oracle?

  4. Oracle XML:Пропускане Не съществува възел

  5. Нотация за извикване за PL/SQL подпрограми в базата данни на Oracle