令和4年度 秋期 午前Ⅱ 問6
データ操作
NULLに関する問題
“文書”表,“社員”表から結果を得る SQL 文の a に入れる字句はどれか。
文書
| 文書 ID | 作成者 ID | 承認者 ID |
|---|---|---|
| 1 | 100 | 200 |
| 2 | 100 | 300 |
| 3 | 200 | 400 |
| 4 | 500 | 400 |
社員
| 社員 ID | 氏名 |
|---|---|
| 100 | 山田太郎 |
| 200 | 山本花子 |
| 300 | 川上一郎 |
| 400 | 渡辺良子 |
〔結果〕
| 文書 ID | 作成者 ID | 作成者氏名 | 承認者 ID | 承認者氏名 |
|---|---|---|---|---|
| 1 | 100 | 山田太郎 | 200 | 山本花子 |
| 2 | 100 | 山田太郎 | 300 | 川上一郎 |
| 3 | 200 | 山本花子 | 400 | 渡辺良子 |
| 4 | 500 | NULL | 400 | 渡辺良子 |
〔SQL 文〕
SELECT 文書 ID, 作成者 ID, A.氏名 AS 作成者氏名,
承認者 ID, B.氏名 AS 承認者氏名 FROM [ a ]- ア文書 LEFT OUTER JOIN 社員 A ON 文書.作成者 ID = A.社員 ID LEFT OUTER JOIN 社員 B ON 文書.承認者 ID = B.社員 ID
- イ文書 RIGHT OUTER JOIN 社員 A ON 文書.作成者 ID = A.社員 ID RIGHT OUTER JOIN 社員 B ON 文書.承認者 ID = B.社員 ID
- ウ文書, 社員 A, 社員 B LEFT OUTER JOIN 社員 A ON 文書.作成者 ID = A.社員 ID LEFT OUTER JOIN 社員 B ON 文書.承認者 ID = B.社員 ID
- エ文書, 社員 A, 社員 B WHERE 文書.作成者 ID = A.社員 ID AND 文書.承認者 ID = B.社員 ID
答えと解説を見る
✓ これが正解ア文書 LEFT OUTER JOIN 社員 A ON 文書.作成者 ID = A.社員 ID LEFT OUTER JOIN 社員 B ON 文書.承認者 ID = B.社員 ID
解説
作成者と承認者の両方を、文書を左に置いた左外部結合でつなぎます。
結果の4行目を見ると、作成者 ID の 500 は社員表に無いのに文書の行は残り、作成者氏名が NULL になっています。これは、文書表を左に置き、作成者 ID で社員表と左外部結合した形でなければ得られません。氏名は作成者と承認者の二人分が必要なので、社員表を A と B の二つの相関名で使い、A とは作成者 ID で、B とは承認者 ID で、それぞれ LEFT OUTER JOIN します。正解の字句を手で評価すると、文書1〜3は両方の氏名が入り、文書4は作成者氏名だけが NULL で、結果の4行と一致します。結果の中の NULL がどちらの表の側に出ているかを見れば、外部結合の向きを決められます。
ほかの選択肢はなぜ違うのか
- イ文書 RIGHT OUTER JOIN …:RIGHT OUTER JOIN は右側の社員表の行を残す結合なので、作成者 ID が 500 の文書4は相手が無く落ちます。代わりに、どの文書の承認者でもない社員 100 の行が、文書 ID を NULL にして残り、結果の4行とは一致しません。
- ウ文書, 社員 A, 社員 B LEFT …:FROM 句に文書と社員 A、社員 B を並べたうえで、さらに社員 A と社員 B を JOIN で加えています。同じ相関名の A と B が二度ずつ現れるので、どちらを指すのか定まらず、SQL 文として成り立ちません。
- エ文書, 社員 A, 社員 B WHERE…:WHERE で文書の作成者 ID と承認者 ID を社員表と突き合わせる内部結合です。作成者 ID の 500 に一致する社員がいないので、文書4の行は結果に残らず、3行だけになります。
出典:令和4年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問6
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)