社員取得資格表のSQL結合条件問題【午前2 解説】
要点まとめ
- 結論:正解はアで、JOIN条件に資格の具体的な値を指定し、WHERE句でC1の資格を絞る構成が正しいです。
- 根拠:LEFT OUTER JOINでC1の資格「FE」を基準にし、C2の資格「AP」を結合条件に含めることで、資格1と資格2を正しく並べられます。
- 差がつくポイント:JOIN条件とWHERE句の使い分け、NULLを含むデータの扱い、資格の組み合わせを正確に表現できるかが重要です。
正解の理由
正解のアは、C1とC2の社員コードが一致し、かつC1の資格が「FE」、C2の資格が「AP」であることをJOIN条件に含めています。さらにWHERE句でC1の資格を「FE」に限定しているため、C1の資格「FE」を基準に資格1、資格2を並べる結果が得られます。これにより、資格1が「FE」、資格2が「AP」の組み合わせが正しく抽出され、問題の結果表と一致します。
よくある誤解
JOIN条件に資格の値を入れずにWHERE句で絞ると、LEFT OUTER JOINの意味が失われ、NULLを含む行が除外されることがあります。これにより期待する結果が得られません。
解法ステップ
- 社員コードでC1とC2を結合する基本条件を設定する。
- 資格1を「FE」に固定し、資格2を「AP」に限定する条件をJOIN句に含める。
- WHERE句でC1の資格を「FE」に絞り、資格1の基準を明確にする。
- LEFT OUTER JOINを使い、資格2が存在しない場合はNULLを許容する。
- 実行結果が問題の結果表と一致するか確認する。
選択肢別の誤答解説
- ア: 正解。JOIN条件とWHERE句の使い分けが適切で、期待通りの結果を得られる。
- イ: WHERE句で「C1.資格 IS NOT NULL」としているため、「FE」以外の資格も含まれ、結果が異なる。
- ウ: WHERE句で「C2.資格='AP'」と指定すると、LEFT OUTER JOINの意味がなくなり、資格2がNULLの行が除外される。
- エ: JOIN条件に資格の値を指定せず、WHERE句で両方の資格を指定すると、INNER JOINと同様の動作になり、NULL行が除外される。
補足コラム
LEFT OUTER JOINは左側テーブルの全行を保持し、右側テーブルの結合条件に合致しない場合はNULLを補完します。JOIN条件に具体的な値を含めることで、結合の粒度を細かく制御でき、複数の資格を列として並べる際に有効です。
FAQ
Q: LEFT OUTER JOINとINNER JOINの違いは何ですか?
A: INNER JOINは両テーブルの結合条件に合致する行のみを抽出しますが、LEFT OUTER JOINは左テーブルの全行を保持し、右テーブルに合致しない場合はNULLを補います。
Q: なぜ資格の条件をJOIN句に入れる必要があるのですか?
A: JOIN句に条件を入れることで、結合の対象となる行を限定し、期待する組み合わせを正確に抽出できます。WHERE句で条件を指定すると、結合後の行を絞り込むため、LEFT OUTER JOINの効果が失われることがあります。
関連キーワード: SQL JOIN, LEFT OUTER JOIN, 結合条件、資格管理、データベース設計、SQL文法、NULL処理