平成22年度 春期 午前 問31
データベース
“商品”表,“在庫”表に対する次の SQL 文と,同じ結果が得られる SQL 文はどれか。ここで,下線部は主キーを表す。
SELECT 商品番号 FROM 商品
WHERE 商品番号 NOT IN (SELECT 商品番号 FROM 在庫)
商品 在庫
_商品番号_│商品名│単価 _在庫番号_│商品番号│在庫数- アSELECT 商品番号 FROM 在庫 WHERE EXISTS (SELECT 商品番号 FROM 商品)
- イSELECT 商品番号 FROM 在庫 WHERE NOT EXISTS (SELECT 商品番号 FROM 商品)
- ウSELECT 商品番号 FROM 商品 WHERE EXISTS (SELECT 商品番号 FROM 在庫 WHERE 商品.商品番号 = 在庫.商品番号)
- エSELECT 商品番号 FROM 商品 WHERE NOT EXISTS (SELECT 商品番号 FROM 在庫 WHERE 商品.商品番号 = 在庫.商品番号)
答えと解説を見る
✓ これが正解エSELECT 商品番号 FROM 商品 WHERE NOT EXISTS (SELECT 商品番号 FROM 在庫 WHERE 商品.商品番号 = 在庫.商品番号)
解説
在庫に現れない商品番号を、相関した否定で書き換えます。
もとの問合せが取り出しているのは、商品表にある商品番号のうち、在庫表のどこにも現れないものです。ここを NOT EXISTS で書き直すときは、三つのことをそろえる必要があります。第一に、取り出す先は商品表のままであること。第二に、内側の問合せが外側の一行ごとに評価され、その行の商品番号と在庫表の商品番号を突き合わせていること。第三に、突き合わせて見つからなかったときだけ残す向きになっていることです。この三つを満たす形が、外側を商品表とし、内側で二つの表の商品番号が等しい行を探し、それが存在しないときに残す書き方になります。判定の軸は、どの表から取り出すか、内側が外側の行と結び付いているか、そして有無のどちらを残すかの三点です。
ほかの選択肢はなぜ違うのか
- アSELECT 商品番号 FROM 在庫 …:取り出す先が在庫表になっている点で、もとの問合せと出どころが違います。さらに内側が外側の行と結び付いていないため、商品表に一行でもあれば条件は成り立ち、在庫表の商品番号がそのまま並ぶ結果になります。
- イSELECT 商品番号 FROM 在庫 …:こちらも取り出す先が在庫表です。内側が外側の行と結び付いていないので、商品表に行が存在する限り条件は成り立たず、一行も返らない結果になります。
- ウSELECT 商品番号 FROM 商品 …:取り出す先と突き合わせの形はそろっていますが、残す向きが逆になっています。在庫表に同じ商品番号が見つかった行を残すので、もとの問合せとちょうど反対の集まりが得られます。
出典:平成22年度 春期 基本情報技術者試験 午前 問31
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)