平成22年度 技術士第一次試験問題【専門科目】
【16】情報工学部門
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在庫Aと在庫Bのに共通する行を取り出し、そこに存在しない行を
 取り出すため正しい。
D
LEFT OUTER JOIN により、在庫Aと在庫Bの商品IDが共通する行を
 結合し、在庫Aにのみある行については、在庫Bの商品IDはNULLになる。
 さらに
WHERE 在庫B.商品ID IS NULLにより、在庫Bの商品IDの項目が
 NULLの行を選べば、結局、店舗Aのみに在庫がある商品を抽出することに
 なるため正しい。


EXCELのマクロのご相談なら ファーストマクロ 



W−26 目次 W−28
ファーストマクロ TOPページ