令和3年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問8
“社員取得資格”表に対し,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
<span id="q8_blank_a" class="blank-label">a</span>
解答・解説
正解: ア. ON C1.社員コード = C2.社員コード
AND C1.資格 = 'FE' AND C2.資格 = 'AP'
WHERE C1.資格 = 'FE'
〔結果〕の表を確認すると、出力されている行は 社員コード が S001、S002、S003 であり、いずれも 資格1 が FE となっています。また、資格2 には AP を持っていればその値が、持っていなければ NULL が表示されています。
この結果を得るためのSQLの条件を整理します。
左表(C1)の絞り込み:
LEFT OUTER JOINを使用しているため、左表であるC1の行は原則としてすべて出力対象になります。〔結果〕には S004(AP)や S005(NULL)が含まれていないため、結合後のWHERE句でC1.資格 = 'FE'として行を絞り込む必要があります。右表(C2)との結合条件:
右表からは AP の資格のみを探して結合します。そのため、結合条件であるON句にC2.資格 = 'AP'を含める必要があります。この条件をWHERE句に記述してしまうと、AP を持たない S002 や S003 がWHERE句の判定で除外されてしまいます。
選択肢の中で、WHERE C1.資格 = 'FE' で左表を絞り込み、ON 句で右表の C2.資格 = 'AP' を指定しているのは ア のみです(ON 句内の C1.資格 = 'FE' は冗長ですが、結果には影響しません)。
各選択肢の解説
- ア: 正解です。
WHERE C1.資格 = 'FE'によって対象を絞り込み、ON句の条件で正しく結合と NULL の生成が行われます。 - イ:
WHERE句の条件がC1.資格 IS NOT NULLとなっています。これでは左表の S004(AP)なども絞り込まれずに残り、結果に含まれてしまうため誤りです。 - ウ:
WHERE句の条件がC2.資格 = 'AP'となっています。これではLEFT OUTER JOINによってC2.資格が NULL となった S002 や S003 の行が除外されてしまうため誤りです。 - エ:
WHERE句にC2.資格 = 'AP'が含まれているため、ウと同様に S002 や S003 の行が除外されてしまい誤りです。