如何摆脱ORA 01779错误:密钥保留表

时间:2017-09-21 09:02:21

标签: sql 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

发生01779错误:无法修改映射到非密钥保留表的列

如何修改sql语句以实现操作?

注意:这个问题没有重复

table1 columns :
 nbqe
 adr1
 adr2
 adr3
 cg
 ce

table2 column :
 nbqe
 adr1
 adr2
 cg
 ce
表2中的

,cg + ce是单个键

在表1中,您可以使用相同的一对(cg,ce)创建多个记录。

没有这些表的约束,甚至没有主键或任何东西。

我会以不同的方式问它。 sql语句可能不对。

更新内部的select返回表1的8行,应该使用table表中可以找到的table2值进行修改。

如何使用表t更新8行sof table1与table2的相应值:是可能的还是我应该写一个大的sql语句,一直重复相同的子查询,这看起来很奇怪而且不干净

2 个答案:

答案 0 :(得分:2)

如果table2对应table1的行不超过一行,请使用merge

merge into table1 d
using table2 s
on (d.cg = s.cg and d.ce = s.ce)
when matched then update set
    d.nbqe = s.nbqe, d.adr1 = s.adr1, d.adr3 = s.adr3

只会更新匹配的行,其余的保持不变。您可以使用update执行此操作,但这样可以避免重复where子句的条件。

测试:

create table table1 (nbqe int, adr1 int, adr2 int, adr3 int, cg int, ce int);
create table table2 (nbqe int, adr1 int, adr2 int, adr3 int, cg int, ce int);

insert into table1 values (1, 1, 1, 1, 1, 1);
insert into table1 values (2, 2, 2, 2, 2, 2);
insert into table1 values (3, 3, 3, 3, 2, 2);

insert into table2 values (5, 5, 5, 5, 2, 2);

结果:

NBQE ADR1 ADR2 ADR3   CG   CE
---- ---- ---- ---- ---- ----
   1    1    1    1    1    1
   5    5    2    5    2    2
   5    5    3    5    2    2

答案 1 :(得分:0)

应该是这样的:

            $terms = get_terms( array(
                'taxonomy' => 'category',
                'hide_empty' => true,
                'number'=>5,
                'orderby'=>'count',
                'order' =>'DESC',
                'meta_query' => array(
                    array(
                        'key'     => 'tag',
                        'value'   => 10,
                        'compare' => 'LIKE',
                    ),
                ),
            ) );

你也没有在你的选择中提供where子句,所以所有成功加入的行都会被更新,这就是你想要的吗?