平成27年度 春期 午前Ⅱ 問8
データ操作
NULLに関する問題
“社員取得資格”表に対し,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にして結果に残ります。正解の字句で評価してみます。左側のC1でFEをもつS001、S002、S003の行は、ONの条件で同じ社員のAPを探します。S001にはAPがあるので(S001, FE, AP)になり、S002とS003にはないので資格2がNULLの行になります。FE以外の行はONの条件を満たさず、資格2がNULLの行として残りますが、WHEREのC1.資格 = 'FE'で除かれます。こうして結果は3行となり、示された結果と一致します。相手探しの条件はON、結果に残す行の条件はWHEREと、役割を分けて読むのがコツです。
ほかの選択肢はなぜ違うのか
- イON C1.社員コード = C2.社員コ…:WHEREがC1.資格の非NULLだけを条件にしているので、APやDB、SMをもつ行も資格2がNULLのまま残ります。S001のAPとDB、S002のSM、S004のAPが加わって7行になり、示された結果と合いません。
- ウON C1.社員コード = C2.社員コ…:WHEREで資格2がAPの行だけを残すため、相手が見つからずにNULLとなったS002とS003の行が消えます。結果は(S001, FE, AP)の1行だけになり、外結合で残したはずの行を失います。
- エON C1.社員コード = C2.社員コ…:ONには社員コードの一致しかなく、FEとAPの条件をWHEREに置いています。WHEREで資格2がAPであることを求めるため、資格2がNULLの行は残らず、結果はS001の1行だけになります。
出典:平成27年度 春期 データベーススペシャリスト試験 午前Ⅱ 問8
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)