문제

Here is something interesting! The merge statement works fine. But when the values match, it does not update the status to 'B' as expected. Any idea why?

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

[also tried using the on duplicate update, but failed to work with an error]

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

please share your knowledge, thanks!

도움이 되었습니까?

해결책

Values from the query cannot match.

Look carefully at this part of the query.

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

This query retrieves ifsc codes that are not equal to any ifsc_code in bbbt table.

Then the query uses these codes to match records:

 on (x.ifsc = b.ifsc_code)

the above is eqivalent to

on (subquery.ifsc = bbbt.ifsc_code)

because x is an alias of the subquery, and b is the bbbt table name.

Think a while ....
The subquery returns only codes that are not equal to any value of bbbt.ifsc_code
It means, that the condition subquery.ifsc = bbbt.ifsc_code never matches.

다른 팁

edited 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');
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top