Когда совпало обновление не работает oracle merge

Вот кое-что интересное! merge Заявление работает отлично. Но когда значения совпадают, он не обновляет статус до "B", как ожидалось. Есть идеи почему?

merge into bbbt b 
using (select bank,ifsc,branch,
              center,district,state,
              address,status 
         from rtgbrn_temp 
        where ifsc in (SELECT ifsc 
                         FROM rtgbrn_temp 
                        MINUS 
                       SELECT ifsc_code 
                         FROM bbbt)
        ) x
   on (x.ifsc = b.ifsc_code)
 when matched then 
   update 
      set rtgs_stat = 'B' 
    where (x.ifsc=b.ifsc_code)
 when not matched then 
   insert (bankid,benbrn_code,brn_name,
           brn_addr,brn_loc,brn_stat,
           brn_city,coun_code,
           remarks,ifsc_code,
           rtgs_stat)
   values (substr(x.ifsc,1,4), substr(x.ifsc,5), 
           x.branch, x.address, x.district, 
           x.state, x.center,'IN', x.bank, x.ifsc,'R');

[также пытался использовать дублирующее обновление, но не смог работать с ошибкой]

SQL Error: ORA-00933: SQL command not properly ended!

insert into bbbt(bankid,benbrn_code,brn_name,brn_addr,brn_loc,brn_stat,brn_city,coun_code,remarks,ifsc_code,rtgs_stat)
select substr(x.ifsc,1,4), substr(x.ifsc,5), x.branch, x.address, x.district, x.state, x.center,'IN', x.bank, x.ifsc,'R' from 
(select bank,ifsc,branch,center,district,state,address,status from rtgbrn_temp where ifsc in (SELECT ifsc FROM rtgbrn_temp MINUS SELECT ifsc_code FROM bbbt))x
ON DUPLICATE KEY UPDATE rtgs_stat = 'B'; 

Пожалуйста, поделитесь своими знаниями, спасибо!

2 ответа

Решение

Значения в запросе не могут совпадать.

Посмотрите внимательно на эту часть запроса.

select ..., ifsc, .....
from rtgbrn_temp 
where ifsc in (........
               .........
               MINUS 
               SELECT ifsc_code 
               FROM bbbt )

Этот запрос извлекает ifsc коды, которые не равны ни одному ifsc_code в bbbt Таблица.

Затем запрос использует эти коды для сопоставления записей:

 on (x.ifsc = b.ifsc_code)

вышесказанное эквивалентно

on (subquery.ifsc = bbbt.ifsc_code)

так как x является псевдонимом подзапроса, и b это bbbt имя таблицы

Подумай немного....
Подзапрос возвращает только коды, которые не равны ни одному значению bbbt.ifsc_code
Это означает, что условие subquery.ifsc = bbbt.ifsc_code никогда не совпадает

Отредактированный код:

merge into bbbt b using (select bank,ifsc,branch,center,district,state,address,status from rtgbrn_temp) x
on (x.ifsc = b.ifsc_code)
when matched then update set rtgs_stat = 'B'
when not matched then insert (bankid,benbrn_code,brn_name,brn_addr,brn_loc,brn_stat,brn_city,coun_code,remarks,ifsc_code,rtgs_stat)
values (substr(x.ifsc,1,4), substr(x.ifsc,5), x.branch, x.address, x.district, x.state, x.center,'IN', x.bank, x.ifsc,'R');
Другие вопросы по тегам