我正在尝试复制Ingres"从tbl2更新tbl1"命令,这在Oracle中并不完全存在.
所以我使用"update(select tbl1 join tbl2 ...)"命令.两个表都定义了主键,我认为我的连接是唯一标识行,但我仍然得到"ORA-01779:无法修改映射到非密钥保留表的列".
这里有适当的匿名表定义和我正在尝试执行的更新:
CREATE TABLE tbl1
(
ID decimal(11) NOT NULL,
A varchar2(3) NOT NULL,
B float(7),
CONSTRAINT tbl1_pk PRIMARY KEY (ID,A)
)
;
CREATE TABLE tbl2
(
ID decimal(11) NOT NULL,
A varchar2(3) NOT NULL,
B float(15),
C float(15),
D char(1) NOT NULL,
CONSTRAINT tbl2_PK PRIMARY KEY (ID,A,D)
)
;
UPDATE
(select tbl1.b, tbl2.c
from tbl1 inner join tbl2
on tbl1.id=tbl2.id
and tbl1.a=tbl2.a
and tbl1.b=tbl2.b
and tbl1.a='foo'
and tbl2.D='a')
set b=c;
Run Code Online (Sandbox Code Playgroud)
如何定义我的选择,以便Oracle确信我没有唯一性违规?
Jus*_*ave 23
您应该能够使用相关子查询执行此操作
UPDATE tbl1 t1
SET t1.b = (SELECT c
FROM tbl2 t2
WHERE t1.id = t2.id
AND t1.a = t2.a
AND t1.b = t2.b
AND t2.d = 'a')
WHERE t1.a = 'foo'
AND EXISTS( SELECT 1
FROM tbl2 t2
WHERE t1.id = t2.id
AND t1.a = t2.a
AND t1.b = t2.b
AND t2.d = 'a')
Run Code Online (Sandbox Code Playgroud)
与这个问题UPDATE你写的是,甲骨文不能保证是完全有1个tbl2.c对应于单一值tbl1.b值.如果tbl2任何特定行中有多行tbl1,则相关更新将抛出一个错误,指示单行子查询返回多行.在这种情况下,您需要向子查询添加一些逻辑,以指定tbl2在该情况下使用哪一行.
| 归档时间: |
|
| 查看次数: |
45960 次 |
| 最近记录: |