Запрос 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 и должно давать правильные результаты.

Поделитесь и наслаждайтесь.

Другие вопросы по тегам