自己外部結合と結合条件・抽出条件

正解の理由 実行結果の表から要件を読み取ります。 出力されている行の「資格1」はすべて 'FE' であり、社員コードは S001, S002, S003 の3行です。S004(APのみ)や S005(NULL)は出力されていません。したがって、左表 C1 の対象行を 'FE' に限定するため `WHERE C1.資格 = 'FE'` が必要です。 「資格2」には、同一社員が 'AP' を取得していればその 'AP' を表示し、取得していなければ 'NULL' を表示しています。左外部結合(LEFT OUTER JOIN)により、条件に一致する右表 C2 の行が存在しない場合でも C1 の行を残すため、C2 側の結合条件 `C2.資格 = 'AP'` は `WHERE` 句ではなく `ON` 句に記述する必要があります。 `ON C1.社員コード = C2.社員コード AND C1.資格 = 'FE' AND C2.資格 = 'AP'` かつ `WHERE C1.資格 = 'FE'` とすることで、S001 は C2 の 'AP' 行と結合して資格2が 'AP' となり、S002 と S003 は一致する C2 行がないため資格2が 'NULL' となって出力されます。したがって、アが正解です。 各選択肢の解説 正しいSQL文です。C1 の資格を 'FE' に絞り込みつつ、C2 の 'AP' を外部結合して存在しない場合は NULL とします。 `WHERE C1.資格 IS NOT NULL` では、S001 の AP や DB、S002 の SM、S004 の AP など、FE 以外の資格を持つ行も C1 として抽出されてしまい、不要な行が出力されます。 `WHERE C2.資格 = 'AP'` を記述すると、外部結合で C2 が NULL になった行(S002 や S003)が WHERE 句の評価で除外されてしまい、内部結合と同じ結果になってしまいます。 `WHERE C1.資格 = 'FE' AND C2.資格 = 'AP'` とすると、C2 が NULL の行が除外され、S001 の1行しか得られません。

“社員取得資格” 表に対し,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 

出典2021r03a_db_am2_問8
ア
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'