令和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文
図の説明テキスト
〔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の条件を整理します。

  1. 左表(C1)の絞り込み:
    LEFT OUTER JOIN を使用しているため、左表である C1 の行は原則としてすべて出力対象になります。〔結果〕には S004(AP)や S005(NULL)が含まれていないため、結合後の WHERE 句で C1.資格 = 'FE' として行を絞り込む必要があります。

  2. 右表(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 の行が除外されてしまい誤りです。

Spineチーム