Когда совпало обновление не работает 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');