複雑なサブクエリになると、エラーがよく出る。

 

解決法:

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があるけど、とりあえずこの考えは制覇した。

 

以上