複雑なサブクエリになると、エラーがよく出る。
解決法:
ERダイアグラムを見て、どのテーブルとどのカラムがつながっているのかを考えながら、サブクエリを作っていく。
一番中のサブクエリから作る場合もあるが、外から作る場合もある。どっちでもOK。
エラーがでるときは、一番中にあるサブクエリだけを実行してみて、エラーになるか、ならないでOUTPUTが出るなら、OUTPUTを確認しながら、もう一つ外側のサブクエリと選択しているカラムがあっているか、などを確認しながらやっていくと、エラーがいつか解決する。
また、パフォーマンスを考えると、サブクエリのOUTPUTが1行だけの場合は、= でつなげる方がパフォーマンスが良くなる。
1行より多いなら、= ANY か IN でつなげる。
つなげるTABLEとコラムのコンビネーションによって、いくつかのCODEができるが、自分でいくつか作ってみてOUTPUTが同じになるか確認すること。
練習問題)UKで働いている人たちのリストを出す。どのテーブルを使っても構わない。コラムもどれでもよい。
ひとつの答え)
select first_name, department_id from employees WHERE department_id IN (select department_id from departments
where location_id IN
(select location_id from locations
where country_id =
( select country_id from countries
where country_name = 'United Kingdom'
)))
;
JOINを使う答え)
select e.first_name, l.country_id from employees e JOIN departments c
on (e.department_id = c.department_id)
JOIN locations l
on (c.location_id = l.location_id)
where c.location_id = ANY
(
select l2.location_id from locations l2 where country_id = 'UK'
)
;
まだ他にもCODEがあるけど、とりあえずこの考えは制覇した。
以上