Oracle EXISTS查询无法按预期工作 - DB Link错误?

时间:2010-06-04 17:02:06

标签: sql oracle exists database-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'
              )

更新好的,这真的很奇怪。为了看看会发生什么,我从其他数据库(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(按预期方式)。

2 个答案:

答案 0 :(得分:1)

你问题中的第二个查询有点不同 - 它根本没有查看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的第一个查询,并且应该提供正确的结果。

分享并享受。

答案 1 :(得分:0)

查看第一个查询的解释计划。我怀疑有一个错误,查询计划可能会显示无效的重写是如何完成的。