我正在尝试基于另一个表(内部联接)更新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;
作为SELECT语句,我可以使用内部联接来提取此信息。但作为合并声明,我得到上述错误。 SYSTEM是两个表中唯一匹配的数据。如何以不会出错的方式重写上述内容?
答案 0 :(得分:3)
我将展示这个错误的来源是什么 请考虑以下简单示例:
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。
我无法将右表中的两个值分配给左表的单个标量字段,这是不可能的 请更改连接条件,使其仅提供一个唯一 右表中记录左表中的每条记录