平成29年度 技術士第一次試験問題【専門科目】
【16】情報工学部門
V−24
店舗Aに在庫がある商品を表“在庫A” とし、店舗Bに在庫が
ある商品を表“在庫B”とする。このとき、店舗Aだけに
在庫がある商品を抽出するSQL文として、不適切なものはどれか。

       在庫A               在庸B
┌───┬──────────┐┌───┬───────────┐
│商品ID│ 商品名      ││商品ID│ 商品名       │
├───┼──────────┤├───┼───────────┤
│00001 │片袖デスク     ││00001 │片袖デスク      │
├───┼──────────┤├───┼───────────┤
│00002 │L型デスク     ││00003 │スタンダードチェア  │
├───┼──────────┤├───┼───────────┤
│00004 │エコノミーチェア  ││00004 │エコノミーチェア   │
├───┼──────────┤├───┼───────────┤
│00005 │ファイルキャビネット││00006 │書類整理棚(引き出し型)│
└───┴──────────┘└───┴───────────┘



 @ SELECT * FROM 在庫A EXCEPT
   SELECT * FROM 在庫B;
 A SELECT * FROM 在庫A WHERE 商品ID
   NOT IN (SELECT 商品ID FROM 在庫B);
 B SELECT * FROM 在庫A WHERE NOT EXISTS
   (SELECT 商品ID FROM 在庫B WHERE
    在庫A.商品ID = 在庫B.商品ID);
 C SELECT DISTINCT * FROM
   (SELECT * FROM 在庫A UNION ALL
    SELECT * FROM 在庫B);
 D SELECT 在庫A.商品ID, 在庫A.商品名
   FROM 在庫A LEFT OUTER JOIN
   在庫B ON 在庫A.商品ID = 在庫B.商品ID
    WHERE 在庫B.商品ID IS NULL;



【正解】 C
@
EXCEPT SELECT * FROM 在庫B は、
 「
在庫Bからすべてを抽出し、そこに存在するもの以外で」という条件になる。
A
NOT IN (SELECT 商品ID FROM 在庫B) は、
 「
在庫Bから商品IDをすべて抽出し、その中にないもので」という条件になる。
B
NOT EXISTS (SELECT 商品ID FROM 在庫B
 WHERE 在庫A.商品ID = 在庫B.商品ID) は、
 「
在庫Aの商品IDと合致する商品IDを在庫Bから抽出し、そこに存在しない
 もので
」という条件になる。
 在庫Aの商品IDと合致する商品IDを在庫Bから抽出すると、
 商品ID 00001, 00004 が選択されるので、
 そこに存在しない商品IDの 00002, 00005 のみが在庫Aから抽出される。
C不適切である。 
 SELECT * FROM 在庫A UNION ALL SELECT * FROM 在庫B は、
 「
在庫Aのすべてデータの抽出結果と、在庫Bのすべてのデータの抽出結果を
  統合
」すると言う意味になる。
 DISTINCT は重複行を排除して抽出する句であるから、
 統合のデータから、重複行を排除して抽出するということになるが、
 これにより、在庫Bに在庫がない商品も抽出されてしまう。
D LEFT OUTER JOIN 句は 左外部結合である。
 
在庫A LEFT OUTER JOIN 在庫B ON 在庫A.商品ID = 在庫B.商品ID
 は、
在庫Aの商品IDと合致する商品IDを在庫Bから取り出し、
 
在庫Aに結合するということである。
 結合後、 在庫B.商品ID IS NULL により商品Bに在庫がない商品IDと
 商品名が抽出される。

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



V−23 目次 V−25
ファーストマクロ TOPページ