令和3年度 秋期 午前Ⅱ 問8
データ操作
SQL文のaに入れる字句
“社員取得資格”表に対し,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 ]- ア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'
答えと解説を見る
✓ これが正解アON C1.社員コード = C2.社員コード AND C1.資格 = 'FE' AND C2.資格 = 'AP' WHERE C1.資格 = 'FE'
解説
ON で相手を探し、WHERE で C1 を FE に絞ると3行になります。
左外部結合では、ON の条件は右の表から結合相手を探すときにだけ使われ、条件に合う相手が無い左の行も、右側の列を NULL にして残ります。WHERE は結合が済んだ後の行を絞り込みます。正解の字句は、ON で同じ社員コード、C1 が FE、C2 が AP の組を探し、WHERE で C1 が FE の行だけに絞ります。FE を持つのは S001、S002、S003 で、AP も持つ S001 は C2 に AP が入り、S002 と S003 は相手が無いので NULL になります。これで結果の3行と一致します。ON に書いた条件は相手探しにだけ効き、左の行を減らすのは WHERE だと区別して読むことが、外部結合の穴埋めを解く鍵です。
ほかの選択肢はなぜ違うのか
- イON C1.社員コード = C2.社員コ…:WHERE が C1 の資格が NULL でない行を残すだけなので、FE 以外の資格の行も結果に入ります。S001 の AP や DB、S002 の SM、S004 の AP は、ON の条件で相手が見つからず、資格 2 が NULL の行として残るため、結果は3行より多くなります。
- ウON C1.社員コード = C2.社員コ…:WHERE で C2 の資格が AP の行だけに絞るので、外部結合で NULL を補った行が全て落ちます。残るのは S001 の FE と AP の組の1行だけで、S002 と S003 の行が結果に現れません。
- エON C1.社員コード = C2.社員コ…:ON では社員コードの一致だけを見て、資格の条件を WHERE に置いています。結合後に C2 の資格が AP の行だけを残すことになるため、NULL を補った行は消え、S001 の1行しか残りません。外部結合にした意味が失われています。
出典:令和3年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問8
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)