令和3年度 秋期 応用情報技術者試験 午前 問29
テクノロジ/データベース“部門別売上”表から,部門コードごと,期ごとの売上を得る SQL 文はどれか。 部門別売上(部門コード,第1期売上,第2期売上): (D01,1,000,4,000),(D02,2,000,5,000),(D03,3,000,8,000) 〔問合せ結果〕(部門コード,期,売上): (D01,第1期,1,000),(D01,第2期,4,000),(D02,第1期,2,000),(D02,第2期,5,000),(D03,第1期,3,000),(D03,第2期,8,000) (注:本サイトでは原問題の表を文字表記に変換しています)
出典:令和3年度 秋期 応用情報技術者試験 午前 問29
- アSELECT 部門コード, '第1期' AS 期, 第1期売上 AS 売上 FROM 部門別売上 INTERSECT (SELECT 部門コード, '第2期' AS 期, 第2期売上 AS 売上 FROM 部門別売上) ORDER BY 部門コード, 期
- イSELECT 部門コード, '第1期' AS 期, 第1期売上 AS 売上 FROM 部門別売上 UNION (SELECT 部門コード, '第2期' AS 期, 第2期売上 AS 売上 FROM 部門別売上) ORDER BY 部門コード, 期
- ウSELECT A.部門コード, '第1期' AS 期, A.第1期売上 AS 売上 FROM 部門別売上 A CROSS JOIN (SELECT B.部門コード, '第2期' AS 期, B.第2期売上 AS 売上 FROM 部門別売上 B) T ORDER BY 部門コード, 期
- エSELECT A.部門コード, '第1期' AS 期, A.第1期売上 AS 売上 FROM 部門別売上 A INNER JOIN (SELECT B.部門コード, '第2期' AS 期, B.第2期売上 AS 売上 FROM 部門別売上 B) T ON A.部門コード = T.部門コード ORDER BY 部門コード, 期
正解:イ
解説
第1期の行(部門コード,'第1期',第1期売上)と第2期の行(部門コード,'第2期',第2期売上)をそれぞれ SELECT で作り,両者を縦に連結すれば問合せ結果が得られます。行の集合を縦に連結する演算は UNION です。
選択肢ごとの解説
- ア誤り。INTERSECT は両方の問合せ結果に共通する行だけを返します。第1期と第2期の行は期の値が異なり共通行がないため,結果は0行になります。
- イ正しい。第1期の行と第2期の行を UNION で縦に連結することによって,部門コードごと,期ごとの売上が得られます。
- ウ誤り。CROSS JOIN は2つの問合せ結果の直積(全組合せ)を作るため,行数が 3×3=9 行となり,期待する結果になりません。
- エ誤り。INNER JOIN では第1期の値と第2期の値が同じ行に横に並ぶ形となり,SELECT 句で第1期売上だけを取り出しても第2期の行は得られません。