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