平成27年度 秋期 応用情報技術者試験 午前 問29
テクノロジ/データベース“倉庫別商品在庫集計”表から在庫数の合計を求めたい。倉庫番号'C003'の倉庫で在庫数が100以上の商品に対して,全ての倉庫における在庫数の合計を求めるSQL文のaに入る適切な字句はどれか。ここで,該当する商品は複数存在するとともに在庫数が100未満の商品も存在するものとする。また,実線の下線は主キーを表す。 倉庫別商品在庫集計(倉庫番号,商品コード,在庫数) 〔SQL文〕 SELECT 商品コード,SUM(在庫数) AS 在庫合計 FROM 倉庫別商品在庫集計 WHERE a GROUP BY 商品コード
出典:平成27年度 秋期 応用情報技術者試験 午前 問29
- ア商品コード=(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)
正解:ウ
解説
副問合せで倉庫番号'C003'かつ在庫数100以上の商品コードを求め,主問合せでその商品コードに一致する行(全倉庫分)を抽出してから商品コードでグループ化し,在庫数を合計します。複数の商品コードが該当し得るため,単一値を仮定する「=」ではなく,複数値を扱える「IN」を用いるのが適切です。
選択肢ごとの解説
- ア誤り。副問合せが複数の商品コードを返す可能性があるため,単一値との比較を前提とする「=」演算子は使用できずエラーになります。
- イ誤り。ALLは「副問合せの全ての結果に対して条件を満たす」という意味になり,「いずれかの商品コードに一致する」という求める条件とは意味が異なります。
- ウ正しい。副問合せが返す複数の商品コードのいずれかに一致する行を抽出するには,IN演算子を使うのが適切です。
- エ誤り。EXISTSは相関副問合せとして使う必要があり,このまま非相関の副問合せに使っても,倉庫別商品在庫集計全体の存在有無を判定するだけで意図した絞込みになりません。