Запрос Oracle EXISTS не работает должным образом - ошибка DB Link?
Я полностью сбит с толку результатами этого запроса:
select count(*) from my_tab mt
where mt.stat = '2473'
and mt.name= 'Tom'
and exists (select * from company_users@colink.world cu,
personnel_records@colink.world pr
where cu.user_id = pr.user_id
and mt.name = pr.name
and mt.stat = cu.stat
)
Возвращает: 1
В company_users@colink.world есть 0 записей со значением stat='2473', так почему же он возвращает true для существующих?
Если я изменю запрос следующим образом, он возвращает 0:
select count(*) from my_tab mt
where mt.stat = '2473'
and mt.name= 'Tom'
and exists (select * from company_users@colink.world cu,
personnel_records@colink.world pr
where cu.user_id = pr.user_id
and mt.name = pr.name
and cu.stat = '2473'
)
ОБНОВЛЕНИЕ Хорошо, это действительно странно. Просто чтобы посмотреть, что произойдет, я выполнил запрос из другой базы данных (той, на которую ссылаются ссылки в БД), и он дал другие (правильные) результаты.
select count(*) from my_tab@mylink.world mt
where mt.stat = '2473'
and mt.name= 'Tom'
and exists (select * from company_users cu,
personnel_records pr
where cu.user_id = pr.user_id
and mt.name = pr.name
and mt.stat = cu.stat
)
Возвращает 0 (как и ожидалось).
2 ответа
Посмотрите на план объяснения для первого запроса. Я подозреваю, что есть ошибка, и план запроса может показать, как выполняется неправильная перезапись.
Второй запрос в вашем вопросе немного отличается - он вообще не смотрит на cu.stat, и поэтому тот факт, что нет ничего с cu.stat = '2473', не рассматривается. Какие результаты вы получите, если вы выполните
select count(*)
from company_users@colink.world cu,
personnel_records@colink.world pr,
my_tab mt
where mt.stat = '2473' and
mt.name = 'Tom' and
pr.name = mt.name and
cu.user_id = pr.user_id and
cu.stat = mt.stat
Я думаю, что это эквивалентно вашему первому запросу без использования EXISTS и должно давать правильные результаты.
Поделитесь и наслаждайтесь.