平成31年度 春期 午前Ⅱ 問11
データ操作
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でFEの行に絞ります。
外結合では、ONに書いた条件は相手の行をつなぐかどうかだけを決め、左側の行はつながる相手がなくてもNULLを付けて残ります。正解の字句では、ONで社員コードが等しく、C1の資格がFE、C2の資格がAPの組だけをつなぎます。左側の8行のうち、S001のFEはAPとつながり、S002とS003のFEは相手がなくNULLになります。FE以外の資格やNULLの5行も相手がないまま残るので、WHERE C1.資格 = 'FE' で除くと、S001 FE AP、S002 FE NULL、S003 FE NULLの3行になり、結果と一致します。外結合の問題では、ONの条件とWHEREの条件をそれぞれ手で当てはめ、何行残るかを数えるのが確実です。
ほかの選択肢はなぜ違うのか
- イON C1.社員コード = C2.社員コ…:ONの部分は正解と同じなので、外結合のあとには左側の8行が残ります。WHEREのC1.資格 IS NOT NULLで除かれるのは資格がNULLのS005だけで、S001のAPやDB、S002のSM、S004のAPがNULL付きで残り、7行になります。
- ウON C1.社員コード = C2.社員コ…:WHEREでC2.資格がAPの行だけを残すと、相手とつながったS001のFEとAPの1行しか残りません。外結合でNULLを付けて残したS002とS003の行まで消えてしまい、結果の3行と合いません。
- エON C1.社員コード = C2.社員コ…:ONは社員コードの一致だけなので、左側の各行に同じ社員の全ての行がつながります。そのあとWHEREでC1がFEかつC2がAPの組だけに絞ると、S001のFEとAPの1行になり、NULLを含む行が残りません。
出典:平成31年度 春期 データベーススペシャリスト試験 午前Ⅱ 問11
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)