ホーム > データベーススペシャリスト試験 > 2022年
データベーススペシャリスト試験 2022年 午前2 問06
“文書”表, “社員”表から結果を得るSQL文のaに入れる字句はどれか。

ア:
文書 LEFT OUTER JOIN 社員 A ON 文書.作成者ID = A.社員ID
LEFT OUTER JOIN 社員 B ON 文書.承認者ID = B.社員ID
(正解)イ:
文書 RIGHT OUTER JOIN 社員 A ON 文書.作成者ID = A.社員ID
RIGHT OUTER JOIN 社員 B ON 文書.承認者ID = B.社員ID
ウ:
文書, 社員 A, 社員 B
LEFT OUTER JOIN 社員 A ON 文書.作成者ID = A.社員ID
LEFT OUTER JOIN 社員 B ON 文書.承認者ID = B.社員ID
エ:
文書, 社員 A, 社員 B
WHERE 文書.作成者ID = A.社員ID AND 文書.承認者ID = B.社員ID
解説
文書表と社員表の結合に関するSQL文の字句選択【午前2 解説】
要点まとめ
- 結論:文書表を基準に社員表を2回LEFT OUTER JOINし、作成者氏名と承認者氏名を取得するのが正解です。
- 根拠:作成者IDや承認者IDに社員が存在しない場合も文書は表示し、社員名はNULLになるためLEFT OUTER JOINが必要です。
- 差がつくポイント:JOINの種類とテーブルの結合順序、別名の使い方を正しく理解し、複数回のJOINで別の役割の社員表を区別することが重要です。
正解の理由
選択肢アは、文書表を基準にLEFT OUTER JOINで社員表を2回結合しています。
1回目は作成者IDと社員IDを結びつけ、2回目は承認者IDと社員IDを結びつけています。
これにより、文書表のすべての行が保持され、対応する社員がいない場合はNULLが入るため、問題の結果と一致します。
1回目は作成者IDと社員IDを結びつけ、2回目は承認者IDと社員IDを結びつけています。
これにより、文書表のすべての行が保持され、対応する社員がいない場合はNULLが入るため、問題の結果と一致します。
よくある誤解
INNER JOINやRIGHT OUTER JOINを使うと、社員が存在しない文書が除外されるため、結果が異なります。
また、複数の社員表をカンマ区切りで指定しつつJOIN句を使うのは文法的に誤りです。
また、複数の社員表をカンマ区切りで指定しつつJOIN句を使うのは文法的に誤りです。
解法ステップ
- 結果に文書表のすべての行が必要か確認する(存在しない社員でも文書は表示)。
- 作成者IDと承認者IDの両方で社員表を参照するため、社員表を2回別名で結合する必要があると判断。
- LEFT OUTER JOINを使い、文書表を基準に社員表を結合するSQL文を作成。
- 作成者IDと社員ID、承認者IDと社員IDをそれぞれON句で結びつける。
- 選択肢の中から文法と結果が合致するものを選ぶ。
選択肢別の誤答解説
- ア: 正解。文書表を基準にLEFT OUTER JOINで社員表を2回結合し、NULLも許容している。
- イ: RIGHT OUTER JOINを使っているが、文書表が右側になるため文書に存在しない社員が優先され、結果が異なる。
- ウ: FROM句にカンマ区切りで社員表を指定しつつLEFT OUTER JOINも使っており、SQL文法として誤り。
- エ: カンマ区切りの結合とWHERE句での条件指定はINNER JOIN相当で、社員が存在しない文書は除外される。
補足コラム
LEFT OUTER JOINは左側のテーブルのすべての行を保持し、右側のテーブルに対応する行がなければNULLを返します。
複数回同じテーブルを結合する場合は別名(エイリアス)を付けて区別することが必須です。
SQLの結合順序やJOINの種類は結果に大きく影響するため、問題文の結果イメージをよく確認しましょう。
複数回同じテーブルを結合する場合は別名(エイリアス)を付けて区別することが必須です。
SQLの結合順序やJOINの種類は結果に大きく影響するため、問題文の結果イメージをよく確認しましょう。
FAQ
Q: LEFT OUTER JOINとINNER JOINの違いは何ですか?
A: INNER JOINは両方のテーブルに一致する行のみを返しますが、LEFT OUTER JOINは左側テーブルのすべての行を返し、右側に一致がなければNULLを返します。
A: INNER JOINは両方のテーブルに一致する行のみを返しますが、LEFT OUTER JOINは左側テーブルのすべての行を返し、右側に一致がなければNULLを返します。
Q: なぜ社員表を2回結合する必要があるのですか?
A: 作成者IDと承認者IDはどちらも社員IDを参照していますが、異なる役割のため別々に結合し、それぞれの氏名を取得する必要があります。
A: 作成者IDと承認者IDはどちらも社員IDを参照していますが、異なる役割のため別々に結合し、それぞれの氏名を取得する必要があります。
関連キーワード: SQL JOIN, LEFT OUTER JOIN, テーブル結合, エイリアス, NULL処理, 複数テーブル結合