平成27年度秋期 応用情報技術者試験 午前 問29
“倉庫別商品在庫集計”表から在庫数の合計を求めたい。倉庫番号'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)
解答・解説を見る
正解:ウ
AI解説
正解はウ。副問合せ「倉庫番号='C003'かつ在庫数>=100の商品コード」は複数行を返す(問題文に該当商品は複数存在とある)。複数行を返す副問合せの結果と比較するには,いずれかの値に一致すればよいIN述語を使う。これにより該当商品コードの全倉庫分の行が選択され,GROUP BYとSUMで商品ごとの在庫合計が求められる。 ア: 「=」は副問合せが1行だけ返す場合にしか使えない。複数行が返るため実行時エラーとなる。 イ: =ALLは「副問合せの全結果と等しい」ことを要求する。異なる商品コードが複数返る場合,全部と同時に等しい値は存在せず,結果が得られない。 ウ: 正しい。INは副問合せが返す値集合のいずれかに一致する行を選ぶ述語で,複数行の結果に対して正しく機能する。 エ: このEXISTSは外側の行と結び付ける相関条件がない非相関副問合せで,該当行が1行でもあれば常に真となり,全商品の行が対象になってしまう。 💡 「副問合せが複数行→ =は不可,INかANY/EXISTS(相関付き)を使う」が鉄則。=ALLは「全部と等しい」なので複数の異なる値が返る時点で不成立,EXISTSは相関条件の有無を必ず確認する。
※Web掲載用に表記を一部変更しています。著作権はIPAに帰属します。