店舗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 |