Re: 問題ID: 20001 について

この質問の投稿一覧へ

なし Re: 問題ID: 20001 について

msg# 1.1
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.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と書いても問題ないです

投稿ツリー

  >フォーラム検索へ


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