その他の結合演算子と結合演算子との組み合わせ
では、最後は頭の中でSQL文の実行結果をイメージしながら、解答していただきましょう。
問4
問合せの結果が同じになるのはどのSQL文ですか。2つ選択してください。
-
a. SELECT department_id,manager_id from departments
UNION SELECT department_id,employee_id from employees; -
b. SELECT department_id,manager_id from departments
MINUS SELECT department_id,employee_id from employees; -
c. SELECT department_id,manager_id from departments
INTERSECT SELECT department_id,employee_id from employees; -
d. SELECT d.department_id,d.manager_id from departments d
JOIN employees e ON d.department_id = e.department_id
AND d.manager_id = e.employee_id; -
e. SELECT d.department_id,d.manager_id from departments d
LEFT OUTER JOIN employees e ON d.department_id = e.department_id
AND d.manager_id = e.employee_id;
各選択肢の実行例を次に示します。INTERSECTと結合は共通する行を求めることができます。したがって、正解は選択肢cとdです。
SQL> --選択肢c
SQL> SELECT department_id,manager_id from departments
2 INTERSECT SELECT department_id,employee_id from employees;
DEPARTMENT_ID MANAGER_ID
------------- ----------
10 200
20 201
30 114
40 203
50 121
60 103
70 204
80 145
90 100
100 108
110 205
11行が選択されました。
SQL> --選択肢d
SQL> SELECT d.department_id,d.manager_id from departments d
2 JOIN employees e ON d.department_id = e.department_id
3 AND d.manager_id = e.employee_id;
DEPARTMENT_ID MANAGER_ID
------------- ----------
90 100
60 103
100 108
30 114
50 121
80 145
10 200
20 201
40 203
70 204
110 205
11行が選択されました。
選択肢aのUNIONは共通しない行も出力します。もし、FULL OUTER JOINが使われていたら、同じ結果にならないか注意して見たほうがいいですね。
SQL> --選択肢a
SQL> SELECT department_id,manager_id from departments
2 UNION SELECT department_id,employee_id from employees;
DEPARTMENT_ID MANAGER_ID
------------- ----------
10 200
20 201
20 202
……(途中省略)……
260
270
178
124行が選択されました。
選択肢bのMINUSは最初の問合せだけが返す行を出力します。もし、OUTER JOINで外部結合をしており、かつWHERE句で一方の表にしかない行を絞り込んでいたら、注意しましょう。
SQL> --選択肢b
SQL> SELECT department_id,manager_id from departments
2 MINUS SELECT department_id,employee_id from employees;
DEPARTMENT_ID MANAGER_ID
------------- ----------
120
130
140
……(途中省略)……
260
270
16行が選択されました。
選択肢eのようにOUTER JOINでもWHERE句で絞り込んでいない場合、共通する行も出力されるので、MINUSと同じ結果にはなりません。
SQL> --選択肢e
SQL> SELECT d.department_id,d.manager_id from departments d
2 LEFT OUTER JOIN employees e ON d.department_id = e.department_id
3 AND d.manager_id = e.employee_id;
DEPARTMENT_ID MANAGER_ID
------------- ----------
90 100
60 103
100 108
……(途中省略)……
130
120
27行が選択されました。
前回、副問合せを解説したときにも言いましたが、「12cSQL試験は難しい」と感じるのは、SQL文およびその実行結果をちゃんとイメージできなければ正解できないためです。
結合、副問合せ、集合演算子のいずれを使っても同じ結果を求められる場合があります。実務では、実行速度やSQL文のメンテナンスのしやすさなどを基準にどの方法を使うかを判断するでしょうが、12cSQL試験に合格するためには「こういう結果を求めたいんだけど」という問いに対して、いずれを使ってもSQL文が書けるようにしておいてください。

