Ще покажа какъв е източникът на тази грешка.
Разгледайте прост пример по-долу:
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 от дясната таблица.
Не мога да присвоя две стойности от дясната таблица към едно скаларно поле на лявата таблица, това е невъзможно.
Моля, променете условието за присъединяване, така че да дава само един уникален запис от дясната таблица за всяка запис в лявата таблица