我有两个查询。一个返回此输出:
SQL > select * from TableA
id | stable | a | l | N | user | date | Ouser | Odate |
-----------------------------------------------------------------------------------
x | aa | GHUA | 0000 | 1000 | userA | 1223 | userA | 1223 |
y | bbb | GHUA | 1111 | 2000 | userB | 1223 | userA | 1223 |
z | ccc | GHUA | 2222 | 3000 | userC | 1223 | userA | 1223 |
另一个返回此:
SQL > select * from TableB
id | stable | a | l | N | user | date | Ouser | Odate |
-----------------------------------------------------------------------------------
A | abe | GHUA | 3000 | 4100 | userD | 1224 | userB | 1223 |
B | aa | GHUA | 0000 | 1100 | userC | 1224 | userC | 1223 |
C | bbb | GHUA | 1111 | 2100 | userD | 1224 | userD | 1223 |
D | ccc | GHUA | 2222 | 3300 | userE | 1224 | userE | 1223 |
================================================ =======================
我想使用merge into
来更改TableA和TableB中的数据,但是总是更新/插入失败。
有人可以给我一些建议吗?
merge into TableA d
using TableB s
on (trim(d.stable) = trim(s.stable) and trim(d.a) = trim(s.a) and
trim(d.l) = trim(s.l))
when MATCHED then
update set (d.n = trim(s.n),d.user= s.user,d.date= s.date)
when NOT MATCHED then
insert (ID,stable,a,l,n,user,date,Ouser,Odate)
values(ID,stable,a,l,n,user,date,Ouser,Odate);
答案 0 :(得分:3)
当我运行您的代码时,它抛出了该错误:
ORA-01747:无效的user.table.column,table.column或列规范
这是因为您将SET子句错误地包装在括号中。您需要删除它们。
已经完成了代码的投放:
ORA-38101:“插入值”子句中的无效列:“ D”。“ ID”
这是因为源表和目标表具有相同的投影,因此INSERT语句中的列名定义不明确。您可能会争辩说,编译器应该知道INSERT()投影中的列引用了tableA
,而VALUES()投影中的列引用了tableb
。无论如何,我们必须服从编译器。因此,您需要限定列名。
此版本的代码有效:
merge into TableA d
using TableB s
on (trim(d.stable) = trim(s.stable)
and trim(d.a) = trim(s.a)
and trim(d.l) = trim(s.l))
when MATCHED then
update
-- remove unnecessary brackets
set d.n = trim(s.n)
,d.usr= s.usr
,d.dt= s.dt
when NOT MATCHED then
-- alias all the columns
insert (d.ID,d.stable,d.a,d.l,d.n,d.usr,d.dt,d.Ouser,d.Odate)
values (s.ID,s.stable,s.a,s.l,s.n,s.usr,s.dt,s.Ouser,s.Odate);