Ошибка обновления MERGE INTO - PullRequest
0 голосов
/ 23 декабря 2018

У меня два запроса.Один возвращает этот вывод:

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, чтобы заменить таблицу A данными из таблицы B, но всегда обновлять / вставлять ошибку.

Может ли кто-нибудь дать мне совет?

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 голосов
/ 23 декабря 2018

Когда я запускал ваш код, он выдавал эту ошибку:

ORA-01747: недопустимая спецификация user.table.column, table.column или столбца

Thisпотому что вы ошибочно заключили предложение SET в скобки.Вы должны удалить их.

Сделав так, чтобы код швырнул:

ORA-38101: Неверный столбец в предложении INSERT VALUES: "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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...