
出典:公益社団法人 日本技術士会「技術士第一次試験 過去問題」
表「在庫A」(店舗Aの在庫)と表「在庫B」(店舗Bの在庫)から、店舗Aだけに在庫がある商品を抽出するSQL文として不適切なものを選ぶ問題。UNION ALLは、両方の表の全行を返す。
「Aにあって、Bにない行」を取得する複数の書き方と、そうならない書き方を区別する問題。
① 「Aにあって Bにない」=差集合。EXCEPT、NOT IN、NOT EXISTS、LEFT JOIN+IS NULL で書ける。UNION は和集合
② ④は在庫Aと在庫Bの全行を合わせて重複を除いただけで、店舗Bの商品も出てくる
③ ④
④の SELECT DISTINCT * FROM (SELECT * FROM 在庫A UNION ALL SELECT * FROM 在庫B) は、在庫Aと在庫Bのすべての行を、重複を除いて合わせたもの(和集合)を返す。店舗Aだけに在庫がある商品ではなく、店舗Aまたは店舗Bのいずれかに在庫がある商品すべてが得られるので、不適切である。
差集合(A−B)は、EXCEPT、NOT IN、NOT EXISTS、LEFT JOIN+IS NULL の各方法で書ける。UNIONは和集合、INTERSECTは積集合。
キーワード: SQL、EXCEPT、NOT IN、NOT EXISTS、UNION ALL、LEFT OUTER JOIN、差集合、情報工学部門