データベーススペシャリスト 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
🔒 解説は解答すると表示されます
LEFT OUTER結合【午前2解説】
正解の理由
出力結果を見ると、文書表のすべての行(文書ID 1〜4)が保持されており、作成者ID 500 に対応する社員が存在しない行(文書ID 4)では作成者氏名が NULL になっています。一方、承認者が社員に存在する場合は氏名が表示されています。これは「左側の表(文書)を全行保持しつつ、社員表は一致する行があれば結合する」動作をする LEFT OUTER JOIN の動きと一致します。したがって正しい句は ア に示された LEFT OUTER JOIN を並べる構造です。
解法ステップ
- 結果の特徴を確認する
- 文書ID 4 が結果にあり、作成者氏名が NULL → 文書表の行が削られていない。
- どちらの表を優先(全行保持)しているか判定
- 文書表の行がすべて残っているので、「文書」を優先する(=左側に置く)。
- 必要な結合の種類を決定
- 優先表を保持しつつ対応する社員情報だけ取りたい → LEFT OUTER JOIN を用いる。
- 同一テーブルを2回使うための別名を付与
- 作成者と承認者それぞれで社員表を参照するので A, B のような別名を付けて2回結合する。
- SQL を組み立てる
- FROM 文書 LEFT OUTER JOIN 社員 A ON 文書.作成者ID = A.社員ID LEFT OUTER JOIN 社員 B ON 文書.承認者ID = B.社員ID
以下は正しい SQL の例です。
SELECT 文書ID, 作成者ID, A.氏名 AS 作成者氏名,
承認者ID, B.氏名 AS 承認者氏名
FROM 文書
LEFT OUTER JOIN 社員 A ON 文書.作成者ID = A.社員ID
LEFT OUTER JOIN 社員 B ON 文書.承認者ID = B.社員ID;
選択肢別の誤答解説
-
ア: 正答。文書表を左側に置き、作成者・承認者それぞれについて社員表を LEFT OUTER JOIN しているため、文書表の行をすべて保持しつつ、該当する社員がなければ氏名が NULL になる。設問の結果と一致する。
-
イ: RIGHT OUTER JOIN を使っているが、RIGHT OUTER JOIN は「右側の表の行をすべて保持する」動作です。ここで右側に置かれるのは社員表なので、社員表の行が優先され、文書表に対応する行がない社員(もしあれば)も結果に出てしまいます。設問の結果は文書表の行がすべて残るケースなので合致しません。
-
ウ: FROM 節で「文書、社員 A, 社員 B」と列挙しつつさらに LEFT OUTER JOIN している構文は誤りか、二重参照により混乱を招きます。通常、同一エイリアス(社員 A)を FROM に並べておいて、さらに同名エイリアスで JOIN するのは不整合であり、期待する動作(文書を基準にして社員を左外部結合で二回結合)を明確に表していません。正しい書き方は FROM 文書 LEFT OUTER JOIN 社員 A ... のように明示的に書くことです。
-
エ: WHERE 句で結合条件を書く形は、等価条件が満たされない行を排除するため INNER JOIN と同じ動作になります(外部結合の効果を得られない)。作成者ID に対応する社員が存在しない文書(作成者ID = 500 の文書ID 4)は WHERE 条件で弾かれてしまうため、設問の結果(文書ID 4 が残る)と矛盾します。
よくある誤解
- RIGHT と LEFT を混同する:どちらを「保持」するかは JOIN の左右(左表・右表)で決まるため、どの表を左側に書くかを常に意識する必要があります。
- WHERE = 外部結合と同じになると考える:WHERE による結合条件は行を除外するため、外部結合の NULL を許容する動作にはなりません(INNER 相当になります)。
- JOIN の順序は常に無関係と考える:内部結合は結合順序の見かけ上の差が少ないが、外部結合では「どの表を基準に残すか」が結果に直結するため順序・左右が重要です。
補足コラム
- 同一テーブルを複数回結合する場合は必ずエイリアス(別名)を付ける。そうすることでどの結合条件がどの参照を指すか明確になります。
- LEFT OUTER JOIN によって生じる NULL 値を扱うには、COALESCE 関数などでデフォルト値を指定することがよくあります。例: COALESCE(A.氏名, '未登録') AS 作成者氏名
- RIGHT OUTER JOIN は LEFT と役割を逆にしただけなので、可読性の観点から LEFT に置き換えて書くのが一般的です(右側の表を左に入れ替えて LEFT JOIN を使う)。
FAQ
Q. LEFT と RIGHT のどちらを使えばよいですか?
A. 出力で「どちらの表の行をすべて残したいか」を基準に決めます。残したい表を左側に書き、LEFT OUTER JOIN を使うのが一般的です。
A. 出力で「どちらの表の行をすべて残したいか」を基準に決めます。残したい表を左側に書き、LEFT OUTER JOIN を使うのが一般的です。
Q. WHERE 句で結合条件を書くと何が問題ですか?
A. WHERE による結合は一致しない行を排除するため INNER JOIN 相当になります。外部結合のように片側の行を保持したい場合は JOIN ... ON を使います。
A. WHERE による結合は一致しない行を排除するため INNER JOIN 相当になります。外部結合のように片側の行を保持したい場合は JOIN ... ON を使います。
Q. 同じ社員表を2回結合するときに注意する点は?
A. 必ず別名(例 A, B)を付け、結合条件でどちらの別名を参照しているか明確にすること。さもないと不整合や重複参照のエラーや誤った結果になります。
A. 必ず別名(例 A, B)を付け、結合条件でどちらの別名を参照しているか明確にすること。さもないと不整合や重複参照のエラーや誤った結果になります。
関連キーワード: SQL JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN、外部結合、結合順序、NULL処理、テーブル別名、結合条件

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

