我正在尝试复制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确信我没有唯一性违规?
这是sql语句:
UPDATE
(SELECT table1.nbqe as OLD_nbqe, table2.nbqe as NEW_nbqe,
table1.adr1 as OLD_adr1, table2.adr1 as NEW_adr1
table1.adr3 as OLD_adr3, table2.adr2 as NEW_adr3
FROM table1
INNER JOIN table2
ON table1.cg= table2.cg AND table1.ce = table2.ce
) t
SET t.OLD_nbqe = t.NEW_nbqe, t.OLD_adr1 = t.NEW_adr1, t.OLD_adr3 = t.NEW_adr3
Run Code Online (Sandbox Code Playgroud)
这会发生 01779 错误:无法修改映射到非键保留表的列
如何修改sql语句来实现操作?
泰
注意:这个问题不重复
table1 columns :
nbqe
adr1
adr2
adr3
cg
ce
table2 column :
nbqe
adr1
adr2
cg
ce
Run Code Online (Sandbox Code Playgroud)
在表2中,cg + ce是单个键
在表 1 中,您可以拥有同一对 (cg、ce) 的多个记录。
这些表没有任何约束,甚至没有主键或任何东西。
我会以不同的方式问它。sql语句可能是错误的。
更新中的选择返回表 1 …