サブクエリの中でも「相関副問い合わせ」が一番ややこしいので、頭の中を整理する。

 

まずは、何を出したいのか。

 

1. サラリーが一番高い人の名前とsalaryを出したい。ー> 普通のサブクエリ でできる。 

   

select first_name || ' ' || last_name fullname, salary from employees
where salary = (select max(salary) from employees)
;

 

 

2. 部署ごとの、サラリーが一番高い人の名前とsalaryを出したい。 ー> 相関サブクエリ。 

 

select department_id, first_name || ' ' || last_name fullname, salary
from employees eout
where salary =
(select max(salary) from employees
where department_id = eout.department_id)
;

 

となる。

 

まずは、OUTPUTが出るまでにどのような過程が行われるのか、を知っておく。

1.メインである 

select department_id, first_name || ' ' || last_name fullname, salary
from employee eout 

が最初に実行される。

2. 1で実行されたOUTPUTが、内部クエリのmax(salary)と比較され、同じ部署に存在する従業員リストの中でMAXが出される。

 

ここで大切なこと:

1.department_idを外側(メイン)のクエリと内側のクエリをWHEREで統合してあげる点。

2.表名エイリアスはメインの表は指定する必要あり。

3.相関副問い合わせは、メイン(外側)から実行されるので、考えるときも外側から構成する。

 

これだけだが、違う表を使ったり、もっと複雑な相関副問い合わせは、もっと混乱する。

 

以上