平成27年度 秋期 午前 問29
データベース
SQL文のaに入る適切な字句
“倉庫別商品在庫集計”表から在庫数の合計を求めたい。倉庫番号 'C003' の倉庫で在庫数が 100 以上の商品に対して,全ての倉庫における在庫数の合計を求める SQL 文の a に入る適切な字句はどれか。ここで,該当する商品は複数存在するとともに在庫数が 100 未満の商品も存在するものとする。また,実線の下線は主キーを表す。
〔関係スキーマ〕(原典は主キーに実線の下線。ここでは主キーに * を付けて写した)
倉庫別商品在庫集計(倉庫番号*,商品コード*,在庫数)
〔SQL 文〕
SELECT 商品コード, SUM(在庫数) AS 在庫合計 FROM 倉庫別商品在庫集計
WHERE a
GROUP BY 商品コード- ア商品コード = (SELECT 商品コード FROM 倉庫別商品在庫集計 WHERE 倉庫番号 = 'C003' AND 在庫数 >= 100)
- イ商品コード = ALL (SELECT 商品コード FROM 倉庫別商品在庫集計 WHERE 倉庫番号 = 'C003' AND 在庫数 >= 100)
- ウ商品コード IN (SELECT 商品コード FROM 倉庫別商品在庫集計 WHERE 倉庫番号 = 'C003' AND 在庫数 >= 100)
- エEXISTS (SELECT * FROM 倉庫別商品在庫集計 WHERE 倉庫番号 = 'C003' AND 在庫数 >= 100)
答えと解説を見る
✓ これが正解ウ商品コード IN (SELECT 商品コード FROM 倉庫別商品在庫集計 WHERE 倉庫番号 = 'C003' AND 在庫数 >= 100)
解説
複数行が返るので、IN で受け取ります。
設問は、ある倉庫で在庫数が 100 以上だった商品について、全ての倉庫の在庫数を合計する SQL 文の空欄を選ばせています。答えを決めているのは、該当する商品は複数存在するという但し書きです。内側の問合せが返す商品コードが一つとは限らず、複数の行になるからです。内側の問合せを条件に使うときは、返ってくる行数に合う演算子を選ぶ必要があります。IN は、返ってきた複数の値のいずれかと一致するかどうかを判定するので、複数行をそのまま受け取れます。この条件で絞ると、まず倉庫番号が C003 で在庫数が 100 以上の商品コードの一覧ができ、外側ではその一覧に含まれる商品の行だけが、倉庫を問わず集められます。集めた行を商品コードごとに GROUP BY でまとめて在庫数を合計するので、設問の求める集計になります。副問合せの書き分けは、何行返るかを先に数えるところから始めます。
ほかの選択肢はなぜ違うのか
- ア商品コード = (SELECT 商品コー…:等号の右側に内側の問合せを置く形です。等号は値を一つしか受け取れないため、複数の行が返ってくるこの条件では実行時に誤りとなり、結果を得られません。
- イ商品コード = ALL (SELECT …:返ってきた値の全てと等しいことを求める書き方です。商品コードは一つの値なので、互いに異なる複数の値すべてに一致することはなく、条件が常に成り立たず一行も残りません。
- エEXISTS (SELECT * FRO…:行があるかどうかだけを見る書き方ですが、外側の行を参照していないので相関副問合せになっていません。条件に合う行が一つでもあれば全ての行が残り、在庫数が 100 未満の商品まで合計に混ざります。
出典:平成27年度 秋期 応用情報技術者試験 午前 問29
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)