社員取得資格表に対するLEFT OUTER JOINと結合条件・抽出条件による絞り込み

自己外部結合(LEFT OUTER JOIN)を用いた複数資格行の横並び集約に関する問題です。 結果表を確認すると、以下の特徴があります。 出力される行は資格1がすべて 'FE' であり、社員コードは S001, S002, S003 の3名である。 資格2には 'AP' を取得している社員(S001)のみ 'AP' が表示され、取得していない社員(S002, S003)は NULL が表示されている。 左外部結合において、左側表 C1 の行を 'FE' に限定するためには `WHERE C1.資格 = 'FE'` が必要です。また、右側表 C2 から 'AP' の資格のみを結合させるためには、ON節で `C1.社員コード = C2.社員コード AND C1.資格 = 'FE' AND C2.資格 = 'AP'` を指定する必要があります。これにより、C2に 'AP' が存在しない社員も左外部結合によって NULL で残ります。 したがって、ア が正解です。 WHERE節が `C1.資格 IS NOT NULL` となっているため、C1側で 'FE' 以外の行(S001のAPやDB、S002のSMなど)もすべて抽出されてしまい、結果と一致しません。 WHERE節に `C2.資格 = 'AP'` を指定すると、LEFT OUTER JOIN で結合相手がなく C2.資格 が NULL になった行(S002, S003)がWHERE句で除外されてしまい、S001の1行しか残りません(内部結合と同じ動作になります)。 ON節に資格の絞り込みがなくWHERE節に `C1.資格 = 'FE' AND C2.資格 = 'AP'` を指定しているため、C2にAPが存在しないS002やS003が除外されてしまいます。

“社員取得資格” 表に対し,SQL文を実行して結果を得た。SQL文の〔  a  〕に入れる字句はどれか。

社員取得資格

社員コード

資格

S001

FE

S001

AP

S001

DB

S002

FE

S002

SM

S003

FE

S004

AP

S005

NULL

〔結果〕

社員コード

資格1

資格2

S001

FE

AP

S002

FE

NULL

S003

FE

NULL

〔SQL文〕

SELECT C1.社員コード, C1.資格 AS 資格1, C2.資格 AS 資格2  FROM 社員取得資格 C1 LEFT OUTER JOIN 社員取得資格 C2  〔  a  〕

出典平成31年春期 午前Ⅱ
ア
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'