【解説】正解は選択肢【エ】です。EXCEPT句は、1つ目のSELECT結果から2つ目のSELECT結果に含まれる重複を除いた差集合を求めます。“商品”表の仕入先コードは{K01, K02, K03, K04}であり、“当月商品仕入合計”表の仕入先コードは{K01, K03, K05}です。これらから重複を排除して差集合をとると、{K02, K04}となります。
【詳細解説】■ 本問の核心・解法のポイント
EXCEPT演算子(差集合)の動作を理解しているかを問う問題です。
SQLの集合演算子(UNION, EXCEPT, INTERSECT)は、明示的にALLを指定しない限り、結果から重複行を排除(DISTINCT相当)して出力します。
1. 1つ目の問合せ:
SELECT 仕入先コード FROM 商品
→ 得られる値は K01, K01, K02, K02, K03, K04 です。
2. 2つ目の問合せ:
SELECT 仕入先コード FROM 当月商品仕入合計
→ 得られる値は K01, K03, K05 です。
3. EXCEPT演算(差集合):
1つ目の結果の集合 {K01, K02, K03, K04} から、2つ目の結果の集合 {K01, K03, K05} に含まれる要素を取り除きます。
残るのは {K02, K04} であり、重複のないユニークな行として返されます。
・各選択肢の徹底解説:
・ア:K01, K01, K03 となっており、差集合ではなく両表の共通項などを誤認した結果です。
・イ:K01, K03 は INTERSECT(積集合)を実行した結果です。
・ウ:K02 が重複して出力されていますが、EXCEPT ALL ではなく EXCEPT のため重複は排除されます。
・エ:【選択肢エ★】重複が排除され、K02 と K04 の2行が得られるため正解です。
よって正解はエです。