データベーススペシャリスト試験 2021年 午前208


“社員取得資格”表に対しSQL文を実行して結果を得た。SQL文のaに入れる字句はどれか。
問題画像
ON C1. 社員コード = C2. 社員コード
    AND C1.資格 = 'FE' AND C2.資格 = 'AP'
WHERE C1.資格 = 'FE'
(正解)
ON C1. 社員コード = C2. 社員コード
    AND C1.資格 = 'FE' AND C2.資格 = 'AP'
WHERE C1.資格 IS NOT NULL
ON C1.社員コード = C2.社員コード
    AND C1. 資格 = 'FE' AND C2. 資格 = 'AP'
WHERE C2. = 'AP'
ON C1.社員コード = C2.社員コード 
WHERE C1.資格 = 'FE' AND C2.資格 = 'AP'

解説

社員取得資格表に対するSQL結合条件の選択【午前2 解説】

要点まとめ

  • 結論:正解はアの「ON句に結合条件と資格条件、WHERE句でC1.資格='FE'」を使う構文です。
  • 根拠:LEFT OUTER JOINでC1の資格が'FE'の行を基準に、C2の資格が'AP'の行を結合し、資格1と資格2を分けて取得します。
  • 差がつくポイント:ON句に結合条件と資格条件を正しく記述し、WHERE句でC1の資格を限定することでNULLも含めた正しい結果が得られます。

正解の理由

アのSQL文は、社員コードが同じでC1の資格が'FE'、C2の資格が'AP'の行をON句で結合し、さらにWHERE句でC1の資格を'FE'に限定しています。これにより、資格1に'FE'、資格2に'AP'が対応した行が抽出され、資格2が存在しない場合はNULLが入るため、問題の結果表と一致します。LEFT OUTER JOINの特性を活かし、C1を基準にC2を結合している点が正しい設計です。

よくある誤解

ON句に資格条件を入れずにWHERE句で両方の資格を指定すると、INNER JOINのように動作しNULL行が除外される誤りが起こりやすいです。

解法ステップ

  1. 基準となる資格(ここでは'FE')を持つ行をC1として選ぶ。
  2. 同じ社員コードで資格が'AP'の行をC2として結合する。
  3. LEFT OUTER JOINを使い、C2に該当資格がない場合はNULLを許容する。
  4. ON句に結合条件と資格条件を記述し、WHERE句でC1の資格を限定する。
  5. SELECT句でC1.資格を資格1、C2.資格を資格2として表示する。

選択肢別の誤答解説

  • ア: 正解。ON句に結合条件と資格条件を正しく記述し、WHERE句でC1の資格を限定している。
  • イ: WHERE句で「C1.資格 IS NOT NULL」としているが、これでは資格がNULLの行も含まれ、結果が異なる。
  • ウ: WHERE句で「C2. = 'AP'」と記述が不完全で文法エラー。さらにWHERE句でC2の資格を限定するとLEFT JOINの意味が失われる。
  • エ: ON句に資格条件がなく、WHERE句でC2の資格を指定しているため、LEFT JOINがINNER JOINのように動作し、NULL行が除外される。

補足コラム

LEFT OUTER JOINは左側テーブルの全行を保持し、右側テーブルの結合条件に合致しない場合はNULLを補完します。ON句に結合条件と絞り込み条件を記述し、WHERE句で左側テーブルの条件を指定することで、NULLを含む正しい結果を得られます。資格のように複数行あるデータを列に展開する際に有効な手法です。

FAQ

Q: LEFT OUTER JOINでON句とWHERE句の条件はどちらに書くべきですか?
A: 結合条件や右側テーブルの絞り込みはON句に、左側テーブルの条件はWHERE句に書くのが基本です。WHERE句で右側テーブルの条件を指定するとINNER JOINのように動作します。
Q: 資格がNULLの社員は結果にどう表示されますか?
A: LEFT OUTER JOINでC1の資格が'FE'に限定されているため、資格がNULLの社員はC1に含まれず結果に表示されません。

関連キーワード: SQL JOIN, LEFT OUTER JOIN, 結合条件, 資格管理, データベースクエリ, SQL文法, NULL処理
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ