• ベストアンサー

oracleのexistsついて

oracleのexistsの動きについて教えて下さい。 「http://oracle.se-free.com/dml/01_exists.html」 のサイトで説明されている、例1と例2の動きが わかりません。 何故、存在する場合、存在にない場合で検索できて 全件の結果がえられるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

>emp表ににあるdept_idに’D03’があった場合、’D03’が制限となって >dept 表の’D03’しか出ないのではないでしょうか。  例1と例2は、where条件に、existsの条件しかありません。また、dept表からの相関も指定されていません。つまり、あくまで、emp表でdept_idがD03である人がいるかどうかしか問っていないわけです。  emp表に、dept_idがD03である人がいようがいまいが、dept表の中身には一切関係がありませんから(該当のselect文には、その関係が一切明示されていません。)、結果として、全ての行が出る(例2)か出ないか(例1)のどちらかとなります。  emp表とdept表の各々のdept_idが同じ物を表す(制約する)のであれば、そのようにselect文で明示するか、テーブル構造の外部制約で制約しないとシステムには、そのようなことはわかりません。  明示しなければ、システムにとっては、単に同じ名前のフィールドが二つの表にあるだけのことです。そして、システムにとっては、emp.dept_idとdept.dept_idは、まったく違うものであり、その二つには何の関係もないということになります。(フィールド名が同じなのは、何の意味も持ちません。)  それが、関係があり、制約できるように思えるのは、人間が「勝手に」、二つの表のdept_idを結びつけているからです。  例えば、例をちょっと書き換えてemp表とdept表を逆にします。その時、dept_idがD03の人がいるから、emp_idがD03の人かどうかで・・・なんて考えないでしょう?フィールド名が露骨に違うから。emp.dept_idとdept.dept_idに関係があるように見えるのは、あくまで人間の勝手です。システムにこの二つのフィールドに関係があるとちゃんと伝えるのも、select文の役目でその例が、「例3」「例4」となります。(そして、普通は、exists条件はこうやって相関クエリーとして使う方が多いですね。)

abc999xyz
質問者

お礼

ありがとうございます。 詳しい説明ありがとうございます。 勉強になります。

その他の回答 (1)

回答No.1

例1はemp表にあるdept_idに一つでも'D03'があれば、dept表の中身を全て出すということで、例2はemp表にあるdept_idに一つでも'D03'がなければdept表の中身を全て出すということです。 何故全て出るのかというと dept 表の側に対する制限が何一つないからです。

abc999xyz
質問者

お礼

ありがとうございます。

abc999xyz
質問者

補足

ありがとうございます。 理解不足で恐縮ですが、 >例1はemp表にあるdept_idに一つでも'D03'があれば、dept表の中身を全て出すということで、 とのことですが、 emp表ににあるdept_idに’D03’があった場合、’D03’が制限となって dept 表の’D03’しか出ないのではないでしょうか。 dept表の中身を全て出てくるのでしょうか。