加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle – 更新加入 – 非密钥保留表

发布时间:2020-12-12 15:13:37 所属栏目:百科 来源:网络整理
导读:我试图复制一个Ingres“tbl2”中的更新tbl1命令,这在Oracle中并不完全. 所以我使用“update(select tbl1 join tbl2 …)”命令.两个表都定义了主键,我认为我的连接唯一标识行,但是我仍然得到“ORA-01779:不能修改映射到非密钥保留表的列”. 这里是适当的匿名
我试图复制一个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,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;

如何定义我的选择,使得Oracle将不满足于我没有唯一性违规?

您应该可以使用相关的子查询来执行此操作
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')

您编写的UPDATE的问题是Oracle不能保证只有一个tbl2.c值对应于单个tbl1.b值.如果tbl1中的任何特定行的tbl2中有多行,则相关更新将抛出一个错误,指示单行子查询返回多行.在这种情况下,您需要在子查询中添加一些逻辑,以指定在这种情况下使用tbl2中的哪一行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读