平成26年度 春期 基本情報技術者試験 午前 問28
テクノロジ/データベース“商品”表,“在庫”表に対する次の SQL 文の結果と同じ結果が得られる SQL 文はどれか。ここで,下線部は主キーを表す。 SELECT 商品番号 FROM 商品 WHERE 商品番号 NOT IN (SELECT 商品番号 FROM 在庫) 商品(商品番号,商品名,単価) 在庫(倉庫番号,商品番号,在庫数) ※下線は主キー:商品は商品番号,在庫は倉庫番号と商品番号の組
出典:平成26年度 春期 基本情報技術者試験 午前 問28
- ア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 商品.商品番号 = 在庫.商品番号)
正解:エ
解説
元のSQL文は,商品表の中で在庫表に存在しない商品番号(在庫がない商品)を抽出しています。同じ結果は,商品表を主に相関副問合せで書き換えても得られます。すなわち,商品表の各行について,在庫表の中に同じ商品番号を持つ行が存在しない(NOT EXISTS)ものだけを選べば,在庫のない商品番号が得られ,元のNOT IN文と同じ結果になります。
選択肢ごとの解説
- ア誤り。FROM句が在庫表になっており,抽出対象が商品ではなく在庫のレコードになるため,元のSQL文とは異なる結果になります。
- イ誤り。FROM句が在庫表のままで,かつ条件も商品表に商品番号が存在しない在庫を探すことになり,意図する「在庫のない商品」の抽出とは異なります。
- ウ誤り。EXISTS(存在する場合を抽出)になっており,在庫がある商品を抽出することになるため,NOT INの結果(在庫がない商品)とは逆になります。
- エ正しい。商品表の各行について,商品番号が一致する在庫レコードが存在しないものだけを抽出しており,元のNOT IN文と同じ「在庫のない商品」を求めることができます。