令和2年度 10月 午前 問29
データベース
UNION ALLに関する問題
"東京在庫" 表と "大阪在庫" 表に対して,SQL 文を実行して得られる結果はどれか。ここで,実線の下線は主キーを表す。
〔東京在庫〕
- A001,50
- B002,25
- C003,35
〔大阪在庫〕
- B002,15
- C003,35
- D004,80
〔SQL 文〕
SELECT 商品コード,在庫数 FROM 東京在庫 UNION ALL SELECT 商品コード,在庫数 FROM 大阪在庫
- アA001/50,B002/25,B002/15,D004/80(4 行)
- イA001/50,B002/40,C003/70,D004/80(4 行・在庫数は合算)
- ウA001/50,B002/25,B002/15,C003/35,D004/80(5 行・C003 は 1 件だけ)
- エA001/50,B002/25,B002/15,C003/35,C003/35,D004/80(6 行・全行を残す)
答えと解説を見る
✓ これが正解エA001/50,B002/25,B002/15,C003/35,C003/35,D004/80(6 行・全行を残す)
解説
重複除去せず両方の表を縦につないだ6行が結果です。
この設問は、二つの表の同じ形の結果を縦に並べる SQL の働きを問うています。ですから、選び方の軸は、そのつなぎ方が重複を落とすものか、それとも残すものかという一点だけです。今回書かれている UNION ALL は、重複を落とす動きが付いていない側に当たります。したがって、二つの表の行がそっくり同じであっても、そのまま二行として並びに残ります。集計を掛けているわけでもないので、同じ商品コードの在庫数を足し合わせる動きも、書かれた通りには起きません。二つの表の中身をそのまま順につないだ、行数の合計に等しい結果が得られます。同じコードで在庫が別々に立っていても、それを一行にまとめる仕事はこの書き方の役目ではないという点を、素直に読み取れれば選び分けられます。
ほかの選択肢はなぜ違うのか
- アA001/50,B002/25,B002…:四行だけの並びとして描かれ、あるコードの二つの行がどちらも消えています。重複を落とす書き方であっても違うコードの行を消すことはなく、そもそも書かれている書き方は行を残す側です。動きの中身と合いません。
- イA001/50,B002/40,C003…:商品コードごとに在庫数を合算した四行の並びとして描かれています。書かれた書き方には集計も分類の指定も入っておらず、値を足し合わせて一行にまとめる動きは含まれていません。設問の書き方とは働きが違います。
- ウA001/50,B002/25,B002…:あるコードの重複だけを取り除いて五行にした並びとして描かれています。これは重複を落とす側の書き方に相当する結果で、書かれた書き方はその働きを持たない側です。落とすかどうかの見分けが逆になっています。
出典:令和2年度 10月 応用情報技術者試験 午前 問29
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)