令和3年度 秋期 午前Ⅱ 問6
データ操作
SQL文を実行した結果
“商品”表と“当月商品仕入合計”表に対して,SQL 文を実行した結果はどれか。
商品
| 商品コード | 仕入先コード |
|---|---|
| S001 | K01 |
| S002 | K01 |
| S003 | K02 |
| S004 | K02 |
| S005 | K03 |
| S006 | K04 |
当月商品仕入合計
| 仕入先コード | 仕入合計金額 |
|---|---|
| K01 | 150,000 |
| K03 | 100,000 |
| K05 | 250,000 |
〔SQL 文〕
(SELECT 仕入先コード FROM 商品)
EXCEPT
(SELECT 仕入先コード FROM 当月商品仕入合計)
選択肢は原典では列名“仕入先コード”の結果表。各肢は結果の行を上から順に並べた。
- ア仕入先コード:K01,K01,K03
- イ仕入先コード:K01,K03
- ウ仕入先コード:K02,K02,K04
- エ仕入先コード:K02,K04
答えと解説を見る
✓ これが正解エ仕入先コード:K02,K04
解説
EXCEPT は差を取り重複も除くので、K02 と K04 の2行が残ります。
EXCEPT は、左の問合せ結果から、右の問合せ結果に含まれる行を取り除く集合演算で、ALL を付けない場合は結果から重複行も除かれます。左の問合せは商品表の仕入先コードを全行取り出すので、K01、K01、K02、K02、K03、K04 の6行です。右は当月商品仕入合計表の K01、K03、K05 です。左から右に含まれる K01 と K03 を除くと K02、K02、K04 が残り、重複を除くと K02 と K04 の2行になります。右にだけある K05 は結果に影響しません。この2行が並ぶ選択肢が正解です。EXCEPT は差を取る演算で、ALL が無ければ重複が消える、と押さえておけば、残る行と行数を確実に絞れます。
ほかの選択肢はなぜ違うのか
- ア仕入先コード:K01,K01,K03:K01、K01、K03 は、商品表の仕入先コードのうち当月商品仕入合計表にも存在するものを、重複を残したまま並べた結果です。差ではなく共通する側を取り出しており、さらに重複も消えていないので二重に誤っています。
- イ仕入先コード:K01,K03:K01 と K03 は、両方の表に共通する仕入先コードを重複なしで取り出した結果です。EXCEPT は右の結果に含まれる行を取り除く演算なので、残るのはその反対側、つまり当月の仕入が無い仕入先です。
- ウ仕入先コード:K02,K02,K04:K02、K02、K04 は、取り除く仕入先の選び方は正しいものの、重複行を残したままの結果です。この SQL 文の EXCEPT には ALL が付いていないので、重複は除かれ、K02 は1行になります。
出典:令和3年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問6
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)