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 には stat='2473' のレコードが 0 件あるのに、exist に対して 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 を返します (予想どおり)。

4

2 に答える 2

1

あなたの質問の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 を使用しない最初のクエリと同等であり、正しい結果が得られるはずです。

共有してお楽しみください。

于 2010-06-04T17:37:40.793 に答える
0

最初のクエリの説明計画を見てください。バグがあると思われます。無効な書き換えがどのように行われているかがクエリ プランに示されている可能性があります。

于 2010-06-05T00:42:28.393 に答える