Re: 問題ID:20000
arashi1977
居住地: 広島
投稿数: 1715
引用:これはテーブルの構成がわかってないとイメージしにくそうですね。問題集のトップページにテーブル作成するSQLがあるのでそこも合わせて確認してください。
イメージするために別のところから先に行きますが
・jobsテーブルの中身を見ると、job_idが1001,1002というのは役職が上(取締役、管理職)の人であることがわかります。
・employeesテーブルの中身を見ると、job_idが1001,1002ではない人はmanager_idがNULLではない事がわかります。ここから、manager_idは「上司」を意味すると読み取れます。
・job_idとemployee_idの最小値が同じ1001から始まるので混乱しそうですが、manager_idはdepartmentsテーブルとemployeesテーブルの両方にあるので、ここはemployee_idが入るのではないかと考えられます(employeesテーブルのレコードからすると、job_idが1002(管理職)の人のemployee_idが入っていることから推測)
各テーブルの関係が見えたので、ご質問の内容に移ります。疑問を持たれたSQLは
ですが、順に考えると
・サブクエリでemployeesテーブルからemployee_idのリスト(全従業員のid)を取得
・employeesテーブルのmanager_idに、取得したemployee_idのどれか(INで指定していますので、すべての従業員IDのどれでもマッチする)が含まれている行(=設問の「上司のいる従業員」)を取得
・取得した行のemployee列を表示
となりますので、設問の要件を満たすといえます。
こんな感じでどうでしょうか?
以下の問題、1番が正解なのは理解できるのですが、なぜ4番も正解なのか分かりません。
どなたかご教示お願いします。
イメージするために別のところから先に行きますが
・jobsテーブルの中身を見ると、job_idが1001,1002というのは役職が上(取締役、管理職)の人であることがわかります。
・employeesテーブルの中身を見ると、job_idが1001,1002ではない人はmanager_idがNULLではない事がわかります。ここから、manager_idは「上司」を意味すると読み取れます。
・job_idとemployee_idの最小値が同じ1001から始まるので混乱しそうですが、manager_idはdepartmentsテーブルとemployeesテーブルの両方にあるので、ここはemployee_idが入るのではないかと考えられます(employeesテーブルのレコードからすると、job_idが1002(管理職)の人のemployee_idが入っていることから推測)
各テーブルの関係が見えたので、ご質問の内容に移ります。疑問を持たれたSQLは
SELECT employee_name FROM employees
WHERE manager_id IN (SELECT employee_id FROM employees);
・サブクエリでemployeesテーブルからemployee_idのリスト(全従業員のid)を取得
・employeesテーブルのmanager_idに、取得したemployee_idのどれか(INで指定していますので、すべての従業員IDのどれでもマッチする)が含まれている行(=設問の「上司のいる従業員」)を取得
・取得した行のemployee列を表示
となりますので、設問の要件を満たすといえます。
こんな感じでどうでしょうか?
投稿ツリー
-
問題ID:20000
(takuto0622, 2018-10-11 19:02)
- Re: 問題ID:20000 (arashi1977, 2018-10-11 22:19)
-
Re: 問題ID:20000
(takuto0622, 2018-10-12 13:00)
- Re: 問題ID:20000 (arashi1977, 2018-10-12 13:06)
-
Re: 問題ID:20000
(takuto0622, 2018-10-12 21:16)
- Re: 問題ID:20000 (arashi1977, 2018-10-13 11:05)