4

我对这个查询的结果完全感到困惑:

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 Links 引用的那个)执行了查询,它给出了不同的(正确的)结果。

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(如预期的那样)。

4

2 回答 2

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,并且应该提供正确的结果。

分享和享受。

于 2010-06-04T17:37:40.793 回答
0

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

于 2010-06-05T00:42:28.393 回答