Tôi sẽ chỉ ra nguồn gốc của lỗi này là gì.
Hãy xem xét ví dụ đơn giản dưới đây:
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;
Bây giờ hãy xem xét sự tham gia này:
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 |
truy vấn trên cung cấp một bản ghi duy nhất từ bảng B_100
. Nếu bạn sử dụng điều kiện kết hợp này trong một câu lệnh hợp nhất, kết hợp sẽ chạy mà không có bất kỳ lỗi nào:
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.
Bây giờ hãy xem xét tham gia bên dưới:
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 |
Sự kết hợp ở trên, cho một bản ghi từ A_100
cung cấp hai bản ghi từ B_100
.
Nếu bạn cố gắng sử dụng MERGE với điều kiện tham gia ở trên, bạn sẽ nhận được những điều sau:
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 chỉ đơn giản nói rằng bạn:
Truy vấn cho một bản ghi từ bảng bên trái trả về hai giá trị:2000 và 3000 từ bảng bên phải.
Tôi không thể gán hai giá trị từ bảng bên phải cho một trường vô hướng duy nhất của bảng bên trái, điều này là không thể.
Vui lòng thay đổi điều kiện nối để nó chỉ cung cấp một từ đơn từ bảng bên phải cho mỗi ghi vào bảng bên trái