令和3年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問8
テクノロジ/データベース“社員取得資格”表に対し,SQL 文を実行して結果を得た。SQL 文の a に入れる字句はどれか。 〔SQL 文〕 SELECT C1.社員コード, C1.資格 AS 資格1, C2.資格 AS 資格2 FROM 社員取得資格 C1 LEFT OUTER JOIN 社員取得資格 C2 [ a ]

出典:令和3年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問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'
正解:ア
解説
結果は,FE資格をもつ社員について,資格1にFE,資格2にAP(もっていれば)を並べたものであり,FE資格をもたない社員(S004,S005)は結果に含まれません。ONの条件でC1.資格='FE'かつC2.資格='AP'に限定した上でLEFT OUTER JOINすることで,各社員のFE資格行を基点にAP資格行が存在すれば結合し,存在しなければNULLを補って残します。さらにWHERE句でC1.資格='FE'と絞り込むことで,結合の基点とならなかったFE以外の行(S001のAP行やDB行など)が結果に混入するのを防ぎます。
選択肢ごとの解説
- ア正しい。ONでC1.資格='FE'かつC2.資格='AP'に限定してLEFT OUTER JOINし,WHEREでC1.資格='FE'に絞り込むことで,各社員のFE資格を基点にAP資格の有無に関わらず1行ずつの結果を得られます。
- イ誤り。WHERE C1.資格 IS NOT NULLでは,FE以外の資格行(S001のAP行やDB行など)もC1として残ってしまい,1人の社員について複数の結果行が生成されてしまいます。
- ウ誤り。WHERE C2.資格='AP'とすると,AP資格をもたない社員(S002,S003)の行はLEFT OUTER JOINでC2がNULLになり条件を満たさず除外されてしまい,結果からS002,S003が欠落します。
- エ誤り。ON句にFE・APの条件がないため,C1の各行に対しC2側の同一社員コードの全資格行が結合されてしまい,そのうえでWHEREでC2.資格='AP'に絞り込むと実質的に内結合と同じになり,AP資格をもたない社員(S002,S003)が結果から除外されてしまいます。