本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

平成22年度 技術士第一次試験問題【専門科目】

W−27

店舗Aに在庫がある商品を以下の表“在庫A”とし、店舗Bに在庫がある商品を表“在庫B” とする。 このとき、店舗Aのみに在庫がある商品を抽出するSQL文として、間違っているものを@〜Dの中から選べ。

     在庫A          在庫B
 ┌───┬─────┐ ┌───┬───────┐
 │商品ID│ 商品名 │ │商品ID│  商品名  │
 ┝━━━┿━━━━━┥ ┝━━━┿━━━━━━━┥
 │ 00001│パソコンA│ │ 00001│パソコンA  │
 ├───┼─────┤ ├───┼───────┤
 │ 00002│パソコンB│ │ 00004│プリンタD  │
 ├───┼─────┤ ├───┼───────┤
 │ 00003│デジカメC│ │ 00005│プリンタE  │
 ├───┼─────┤ ├───┼───────┤
 │ 00004│プリンタD│ │ 00006│ディスプレイF│
 └───┴─────┘ └───┴───────┘

@ SELECT * FROM 在庫A EXCEPT SELECT * FROM 在庫B;

A SELECT * FROM 在庫A WHERE 商品ID NOT IN
   (SELECT 商品ID FROM 在庫B);

B SELECT DISTINCT * FROM
   (SELECT * FROM 在庫A UNION ALL SELECT * FROM 在庫B);

C SELECT * FROM 在庫A WHERE NOT EXISTS
  (SELECT 商品ID FROM 在庫B
  WHERE 在庫A.商品ID = 在庫B.商品ID);

D SELECT 在庫A.商品ID, 在庫A.商品名 FROM 在庫A
  LEFT OUTER JOIN 在庫B ON 在庫A.商品ID = 在庫B.商品ID
  WHERE 在庫B.商品ID IS NULL;


正解

B


解説

@ EXCEPT 〜 は「〜以外の条件」という意味であり、在庫Bに存在するレコード以外を取り出すため正しい。

A NOT IN () は、「括弧内にないもの」という意味であり、在庫Bに存在するレコード以外を取り出すため正しい。

B 誤りである。DISTNCT は「重複を削除する」という意味の句である。
UNION ALL は、前後の行の集合を表す。
このSQLは在庫Aと在庫Bのすべての行を重複なく選択する。

C NOT EXISTS 〜 は、「〜に存在しない」という意味であり、在庫Aと在庫Bのに共通する行を取り出し、そこに存在しない行を取り出すため正しい。

D LEFT OUTER JOIN により、在庫Aと在庫Bの商品IDが共通する行を結合し、在庫Aにのみある行については、在庫Bの商品IDはNULLになる。
さらに WHERE 在庫B.商品ID IS NULL により、在庫Bの商品IDの項目がNULLの行を選べば、結局、店舗Aのみに在庫がある商品を抽出することになるため正しい。

W−26 目次 W−28