Oracle существует запрос не работает, как и ожидалось - ошибка ссылки DB?

StackOverflow https://stackoverflow.com/questions/2976236

Вопрос

Я полностью сбит с толку результатами этого запроса:

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

Я думаю, что это эквивалентно вашему первому запросу без использования существующих и должно предоставить правильные результаты.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top