平成22年度 春期 午前Ⅱ 問14
データ操作
副問合せに関する問題
“製品”表と“在庫”表に対し,次の SQL 文を実行した結果として得られる表の行数は幾つか。
SELECT DISTINCT 製品番号 FROM 製品
WHERE NOT EXISTS (SELECT 製品番号 FROM 在庫
WHERE 在庫数 > 30 AND 製品.製品番号 = 在庫.製品番号)
製品
| 製品番号 | 製品名 | 単価 |
|---|---|---|
| AB1805 | CD-ROM ドライブ | 15,000 |
| CC5001 | ディジタルカメラ | 65,000 |
| MZ1000 | プリンタ A | 54,000 |
| XZ3000 | プリンタ B | 78,000 |
| ZZ9900 | イメージスキャナ | 98,000 |
在庫
| 倉庫コード | 製品番号 | 在庫数 |
|---|---|---|
| WH100 | AB1805 | 20 |
| WH100 | CC5001 | 200 |
| WH100 | ZZ9900 | 130 |
| WH101 | AB1805 | 150 |
| WH101 | XZ3000 | 30 |
| WH102 | XZ3000 | 20 |
| WH102 | ZZ9900 | 10 |
| WH103 | CC5001 | 40 |
- ア1
- イ2
- ウ3
- エ4
答えと解説を見る
✓ これが正解イ2
解説
30 を超える在庫がない製品は MZ1000 と XZ3000 の 2 件です。
NOT EXISTS の副問合せは、製品ごとに、在庫数が 30 を超える在庫の行が一つでもあるかを調べ、一つもない製品だけを残します。製品ごとに見ると、AB1805 は WH101 に 150、CC5001 は WH100 に 200 と WH103 に 40、ZZ9900 は WH100 に 130 があるので除かれます。XZ3000 は 30 と 20 で、30 は 30 を超えないので該当する行がなく残ります。MZ1000 は在庫表に行が一つもないので、条件に合う行も存在せず残ります。結果は MZ1000 と XZ3000 の 2 行です。NOT EXISTS は副問合せの行が 1 件もないときに真になるので、在庫表に現れない製品も結果に入ることを見落とさないのが要点です。
ほかの選択肢はなぜ違うのか
- ア1:1 行になるのは、在庫表に行のない MZ1000 を数え漏らして XZ3000 だけを数えた場合か、在庫数 30 も条件に含めて XZ3000 を除いた場合です。行が一つもない製品は NOT EXISTS で真になり、30 は 30 を超えません。
- ウ3:3 行になるのは、30 以下の在庫を一つでも持つ製品を数えた場合で、AB1805、XZ3000、ZZ9900 が該当します。しかし AB1805 と ZZ9900 は 30 を超える在庫も持つので除かれ、在庫表にない MZ1000 も数えていません。
- エ4:4 行になるのは、30 以下の在庫を持つ AB1805、XZ3000、ZZ9900 に、在庫表にない MZ1000 を加えた場合です。AB1805 には 150、ZZ9900 には 130 の在庫があるので、NOT EXISTS の条件を満たしません。
出典:平成22年度 春期 データベーススペシャリスト試験 午前Ⅱ 問14
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)