令和4年度 秋期 データベーススペシャリスト試験 午前II 問6
“文書”表,“社員”表から結果を得るSQL文の a に入れる字句はどれか。

図の説明テキスト
「文書」表
| 文書ID | 作成者ID | 承認者ID |
|---|---|---|
| 1 | 100 | 200 |
| 2 | 100 | 300 |
| 3 | 200 | 400 |
| 4 | 500 | 400 |

図の説明テキスト
「社員」表
| 社員ID | 氏名 |
|---|---|
| 100 | 山田太郎 |
| 200 | 山本花子 |
| 300 | 川上一郎 |
| 400 | 渡辺良子 |

図の説明テキスト
〔結果〕の表
| 文書ID | 作成者ID | 作成者氏名 | 承認者ID | 承認者氏名 |
|---|---|---|---|---|
| 1 | 100 | 山田太郎 | 200 | 山本花子 |
| 2 | 100 | 山田太郎 | 300 | 川上一郎 |
| 3 | 200 | 山本花子 | 400 | 渡辺良子 |
| 4 | 500 | NULL | 400 | 渡辺良子 |

図の説明テキスト
〔SQL文〕
SELECT 文書ID, 作成者ID, A.氏名 AS 作成者氏名,
承認者ID, B.氏名 AS 承認者氏名 FROM <span id="q6_blank_a" class="blank-label">a</span>
解答・解説
正解: ア. 文書 LEFT OUTER JOIN 社員 A ON 文書.作成者ID = A.社員ID
LEFT OUTER JOIN 社員 B ON 文書.承認者ID = B.社員ID
本設問は、「文書」表を基準として、作成者と承認者の名前を「社員」表から取得するSQL文の穴埋め問題です。
「文書」表の「承認者ID」には、未承認などの理由で値が入っていない(NULL)可能性があります。
もし通常の結合(内部結合)を使用すると、承認者IDがNULLの文書は結合条件を満たさず、結果から除外されてしまいます。
そのため、「文書」表のすべての行を出力しつつ、一致する社員情報があれば結合する 外部結合(LEFT OUTER JOIN)を使用する必要があります。
また、「作成者」と「承認者」で同じ「社員」表を参照するため、表に別名(A および B)をつけて区別します。
各選択肢の解説
- ア(正解):
LEFT OUTER JOINを使用しており、「文書」表を基準にして「社員」表を結合しています。これにより、承認者IDがNULLの文書も結果に含まれます。 - イ:
RIGHT OUTER JOINを使用しているため、「社員」表が基準となります。これでは、文書の作成や承認に関わっていない社員も出力される一方で、意図した文書の抽出が正しく行われません。 - ウ:テーブルをカンマで区切って指定した上で
LEFT OUTER JOINを続けており、SQLの標準的な構文として誤っています。 - エ:
WHERE句を用いた通常の結合(内部結合)です。この場合、承認者IDがNULL(未設定)の文書が抽出結果から除外されてしまうため誤りです。