我正在尝试根据另一个表(内连接)更新 Oracle 中的表,但匹配的字段匹配超过 1 行,因此出现错误:
无法获得一组稳定的行
MERGE INTO C
USING D
ON (C.SYSTEM = D.SYSTEM)
WHEN MATCHED THEN
UPDATE SET C.REF_CD = D.CODE,
C.REF_DT = TO_DATE('12/05/2017', 'MM/DD/YYYY')
WHERE C.CODE = '123'
AND D.CODE IS NOT NULL
AND C.CLOSED = 'N'
AND C.RCVD_DT >= TO_DATE('12/01/2017', 'MM/DD/YYYY')
AND C.RCVD_DT <= TO_DATE('12/04/2017', 'MM/DD/YYYY')
AND SUBSTR(C.SSN,7,3) >= D.FROM
AND SUBSTR(C.SSN,7,3) <= D.TO;
Run Code Online (Sandbox Code Playgroud)
作为 SELECT 语句,我可以使用内部联接提取此信息。但是作为合并语句,我收到了上述错误。SYSTEM 是两个表中唯一匹配的数据。如何以不会出错的方式重写上述内容?
我将展示这个错误的根源是什么。
考虑以下简单示例:
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;
Run Code Online (Sandbox Code Playgroud)
现在请考虑这个连接:
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 |
Run Code Online (Sandbox Code Playgroud)
上面的查询给出了表中的一个唯一记录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.
Run Code Online (Sandbox Code Playgroud)
现在请考虑以下连接:
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 |
Run Code Online (Sandbox Code Playgroud)
上面的连接,对于来自的一条记录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
Run Code Online (Sandbox Code Playgroud)
甲骨文只是说你:
对左表中的一条记录的查询返回了两个值:来自右表的 2000 和 3000。
我无法将右表中的两个值分配给左表的单个标量字段,这是不可能的。
请更改连接条件,以便为左表中的每条记录仅提供右表中的一个唯一记录
| 归档时间: |
|
| 查看次数: |
629 次 |
| 最近记录: |