- ベストアンサー
oracleのexistsついて
oracleのexistsの動きについて教えて下さい。 「http://oracle.se-free.com/dml/01_exists.html」 のサイトで説明されている、例1と例2の動きが わかりません。 何故、存在する場合、存在にない場合で検索できて 全件の結果がえられるのでしょうか。
- みんなの回答 (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条件はこうやって相関クエリーとして使う方が多いですね。)
その他の回答 (1)
- noboru2000
- ベストアンサー率33% (47/140)
例1はemp表にあるdept_idに一つでも'D03'があれば、dept表の中身を全て出すということで、例2はemp表にあるdept_idに一つでも'D03'がなければdept表の中身を全て出すということです。 何故全て出るのかというと dept 表の側に対する制限が何一つないからです。
お礼
ありがとうございます。
補足
ありがとうございます。 理解不足で恐縮ですが、 >例1はemp表にあるdept_idに一つでも'D03'があれば、dept表の中身を全て出すということで、 とのことですが、 emp表ににあるdept_idに’D03’があった場合、’D03’が制限となって dept 表の’D03’しか出ないのではないでしょうか。 dept表の中身を全て出てくるのでしょうか。
お礼
ありがとうございます。 詳しい説明ありがとうございます。 勉強になります。