Oracle существует запрос не работает, как и ожидалось - ошибка ссылки DB?
-
24-10-2019 - |
Вопрос
Я полностью сбит с толку результатами этого запроса:
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
Есть 0 записей в компании по адресу company_users@colink.world со 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'
)
ОБНОВИТЬ Хорошо, это действительно странно. Просто чтобы увидеть, что произойдет, я выполнил запрос из другой базы данных (той, на которую ссылаются ссылки DB), и он дал разные (правильные) результаты.
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 (как и ожидалось).
Решение
Посмотрите на план объяснения первого запроса. Я подозреваю, что есть ошибка, и план запроса может показать, как делается недействительная переписать.
Другие советы
Второй запрос в вашем вопросе немного отличается - он вообще не рассматривает 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
Я думаю, что это эквивалентно вашему первому запросу без использования существующих и должно предоставить правильные результаты.
Поделиться и наслаждаться.