レス
元トピ次レス
タイトル
Re: 問題ID: 20001 について
フォーラム
最強WEB問題集Oracle Master 12c Bronze SQL基礎
投稿ユーザ(投稿日)
(2021/6/17)
本文
長文解説失礼いたします

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と書いても問題ないです

レス一覧

元トピ次レス


Ping-tモバイルTOP

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