老親介護に悩む30~60代の方へ
老親介護ねっと[老人ホーム編]
トップ 老人ホームの選び方 介護関連ニュース 新規オープンホーム情報 老人ホーム取材レポート お問い合わせ リンク集 Q&A

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

oracleのexistsついて

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

投稿日時 - 2018-03-16 19:14:59

QNo.9478640

困ってます

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

>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条件はこうやって相関クエリーとして使う方が多いですね。)

投稿日時 - 2018-03-19 23:01:27

お礼

ありがとうございます。

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

投稿日時 - 2018-03-20 08:20:38

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2018-03-16 19:34:56

補足

ありがとうございます。

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

投稿日時 - 2018-03-19 08:39:12

お礼

ありがとうございます。

投稿日時 - 2018-03-19 08:38:40