問題ID: 20001 について

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-6-17 16:42
yamadanbira  半人前   投稿数: 10
1)について、「部下のいない従業員」を表示するするために「上司がいない従業員」を取り出すという認識なのでしょうか。

設問の通り「上司のいない従業員もいる」と書かれているので、
e.manager_id = m.employee_id」が成立しないことは分かります。

しかしそこから部下のいない従業員が取り出される工程が分かりません。
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-6-17 17:44 | 最終変更
yokoyama68  一人前   投稿数: 28
長文解説失礼いたします

1)はWHEREに(NOT) EXISTSを使った相関副問い合わせと呼ばれる
SQLなかでもかなり特殊な動作をするものです
通常のSQLは結果を返すのが目的ですが、相関副問い合わせは
存在を確認するのが目的になります

用語を簡単に置き換えてみます
部下のいない従業員 = 平社員
上司のいない従業員 = 社長

「上司がいない従業員も存在します」という説明はこの問題の罠で
2)の"NOT IN"の時にNULLが含まれる可能性を意味しています
置き換えた例だと"社長"に上司はいないということです
"NOT IN"の時にNULLが含まれると結果が0になることに対しての注意書きです

このSQLですが、WHERE内部の(NOT) EXISTSは結果を返さず
存在判定のみ行います
それが(NOT) INとは大きく異なります
直観的にはプログラミング言語のIF文と考えてもよいでしょう
SELECT m.employee_name FROM employees m
WHERE NOT EXISTS (
SELECT e.employee_id
FROM employees e
WHERE e.manager_id = m.employee_id);

またSQLの実行順番も通常のSQLと異なります
このSQLでは外側のSELECTを実行し、その結果の1行毎に内側の
WHEREを実行します
条件はNOT "WHERE e.manager_id = m.employee_id"なので
自分がだれかの上司となっている行があるか?を確認し、
その後、NOTなので結果をひっくり返したものが結果になります
つまり平社員かを確認していることになります
最終的に条件が満たされた行が外側のSELECTで表示されます

またWHERE内のSELECTに書かれている"e.employee_id"はダミーです
ここに書いたものが外側のSELECTに返るわけではないです
なのでここは"e.employee_id"ではなく、1と書いても問題ないです
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2021-6-18 9:40
yamadanbira  半人前   投稿数: 10
丁寧なご説明ありがとうございます。

「上司がいない従業員」というのは2)のための文という事だったのですね。


相関副問い合わせについてもまだ理解していないので、調べてながら進めていきます。

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.