合并为更新失败

时间:2018-12-23 06:22:22

标签: sql oracle

我有两个查询。一个返回此输出:

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);

1 个答案:

答案 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);