ホーム > データベーススペシャリスト試験 > 2015年
データベーススペシャリスト試験 2015年 午前2 問08
“社員取得資格”表に対し, 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 C1.資格 ='AP'
エ:
ON C1.社員コード = C2.社員コード
WHERE C1.資格 = 'FE' AND C2.資格 = 'AP'
解説
問題の SQL がやりたいこと
- 左外部結合 (LEFT OUTER JOIN) を使って
社員取得資格
表を 同じ表 C1・C2 に自己結合。 - 目的は
- 資格1 として “FE” を持つ行を抽出
- 同じ社員に “AP” があれば 資格2 に表示,無ければ
NULL
得られた結果(S001 は FE と AP,S002/S003 は AP が無い)は
まさに “FE 行を主にして AP 行を左外部結合” した形です。
まさに “FE 行を主にして AP 行を左外部結合” した形です。
社員コード | 資格1 | 資格2
-----------+-------+--------
S001 | FE | AP
S002 | FE | NULL
S003 | FE | NULL
正しく書ける結合条件と WHERE
SELECT
C1.社員コード,
C1.資格 AS 資格1,
C2.資格 AS 資格2
FROM 社員取得資格 C1
LEFT OUTER JOIN 社員取得資格 C2 -- 自己結合
ON C1.社員コード = C2.社員コード -- 同一社員
AND C1.資格 = 'FE' -- C1 は FE
AND C2.資格 = 'AP' -- C2 は AP (あれば)
WHERE C1.資格 = 'FE'; -- FE 行だけを出力
- ON 句 に “C2.資格 = 'AP'” を入れることで
AP を持たない社員は C2 側がNULL
になる (LEFT JOIN の効用)。 - WHERE 句 には C1.資格 = 'FE' だけを書く。
もしC2.資格='AP'
を WHERE に書くと NULL 行が落ちてしまい
S002/S003 が出力されなくなるので NG。
選択肢との対応
結論
a に入る正しい SQL 句は 選択肢「ア」 である。