本文へスキップ

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


Since 2016.4.19

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

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と商品名が抽出される。

V−23 目次 V−25