我正在使用Oracle 10g数据库.
我有以下两个表:
T_DEBTOR :
- ID_DEBTOR
- HEADER
T_ELEMENT :
- ID_ELEMENT
- ID_DEBTOR
- INSURER
Run Code Online (Sandbox Code Playgroud)
这两个表使用ID_DEBTOR字段连接.
我想仅在HEADER不为空时才使用关联的T_DEBTOR.HEADER更新T_ELEMENT.INSURER值.换句话说:
If T_DEBTOR.HEADER != null
Then T_ELEMENT.INSURER = T_DEBTOR.HEADER
Else T_ELEMENT.INSURER is not modified!
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下SQL查询:
update
T_ELEMENT elt
set elt.INSURER = (
select HEADER
from T_DEBTOR debtor
where
debtor.HEADER is not null
and debtor.ID_DEBTOR = elt.ID_DEBTOR);
Run Code Online (Sandbox Code Playgroud)
此查询适用于链接到具有HEADER非空的debtors的所有元素.但是,当T_DEBTOR.HEADER为null时,此查询将T_ELEMENT.INSURER设置为null,这是不正确的.
即:
If T_DEBTOR.HEADER != null
Then T_ELEMENT.INSURER = T_DEBTOR.HEADER --> This part is OK
Else T_ELEMENT.INSURER is set to null --> This part is …Run Code Online (Sandbox Code Playgroud) 这是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 …