令和3年度 秋期 データベーススペシャリスト試験 午後Ⅰ 問3 物件設備のデータ構造変更に伴う移行SQLと互換ビューの設計
テクノロジデータベース
学習ガイド
不動産賃貸仲介業のA社が、物件テーブルの列で持っていた設備の有無を、設備ごとの行で管理する構造に変える問題です。結果行数の見積り、新しい構造の長所、移行に使うSQL文と移行後の統計情報、移行前と同じ結果を得るSQL文、旧テーブルと同じ形で見せるビューの定義が問われます。設備が列から行に変わると、条件の書き方や結合の種類がどう変わるかを一つずつ確かめます。
この記事で押さえる論点
- 繰り返し項目を持つテーブルを別テーブルに分離し、柔軟性を高める設計変更のメリットを説明できる
- 既存のデータを新テーブル構造に移行するためのUNION ALLを活用したSQL文を記述できる
- テーブル構造変更の前後で同等の結果を得るための、結合を用いたSQL文の書き換え手順を説明できる
- 既存のシステムに影響を与えないよう、外部結合とCASE式を用いて移行前の構造を再現するビューを定義できる
出題情報
- 出題
- 2021(R3)秋 データベーススペシャリスト 午後I 問3
- 配点
- 50点満点
- 模範解答
- 公表(設問ごとに掲載)
出題趣旨・採点講評(IPA 公表)
業務を改善するために,データベースのテーブル構造を変更することがある。その場合,現行のテーブル構造から新しいテーブル構造に適切な手順で効率よく移行することが求められる。本問では,RDBMSを用いた不動産賃貸仲介業の検索システムを題材として,テーブル構造の変更の妥当性を適切に評価した上で,検索に利用するSQL文の変更方法,テーブルの移行手順,移行に利用する基本的なSQL構文,及び移行のときに考慮すべきテーブルの統計情報を理解しているかを問う。
問3では,物件情報検索システムを題材に,テーブルの移行及びSQLの設計について出題した。全体として正答率は平均的であった。
問題本文
テーブルの移行及びSQLの設計に関する次の記述を読んで,設問1,2に答えよ。
A社は,不動産賃貸仲介業を全国規模で行っている。RDBMSを用いて物件情報検索システム(以下,検索システムという)を運用している運用部門のKさんは,物件情報を検索するSQL文を設計している。
〔検索システムの概要〕
検索システムは,物件を管理するシステムを補完するシステムであり,社内利用者が接客するとき,当該システムの“物件”テーブルを利用している。
社内利用者の接客業務の概要
(1) 物件を探している借主に対して,当該借主の希望に近い物件を探す支援を行い,借主と貸主との間の交渉・賃貸契約の仲介を行う。
(2) 物件の貸主に対して,物件の審査を行う。当該貸主に長期の空き物件がある場合,周辺の競合物件の付帯設備(以下,設備という)の設置状況を調査し,当該空き物件に人気の設備を増強することなど,物件の付加価値を高める対策の助言を行うこともある。“物件”テーブル
(1) A社が仲介する全ての物件を,物件コードで一意に識別する。
(2) 物件の沿線,最寄駅,賃料,間取りなどの基本属性を記録する列がある。
(3) エアコン,オートロックなどの設備が設置されているかどうかの有無を記録する列があり,一つの物件に最大20個の設備の有無を記録できる。
(4) 記録されている20個の設備について,どの設備もいずれかの物件に設置されているが,20個全ての設備が設置されている物件は限られている。
(5) 設備に流行があるので,テーブルの定義を変更し,記録する人気の設備を毎年入れ替える処理を行っている。この処理を物件設備の入替処理と呼んでいる。
(6) “物件”テーブルの全ての列にNOT NULL制約を指定している。“物件”テーブルのテーブル構造,主な列の意味と制約及び主な統計情報
“物件”テーブルのテーブル構造を図1に,主な列の意味・制約を表1に,RDBMSの機能を用いて取得した主な統計情報を表2に示す。

図の説明テキスト
図1 “物件”テーブルのテーブル構造(一部省略)
物件(物件コード(主キー),物件名,沿線,最寄駅,賃料,間取り,向き,専有面積,築年数,都道府県,市区町村,エアコン,オートロック,…,物件登録日)
※原図では主キーの物件コードに実線の下線が付いており、ここでは「(主キー)」と記す。

図の説明テキスト
表1 “物件” テーブルの主な列の意味・制約(一部省略)
| 列名 | 意味・制約 |
|---|---|
| 物件コード | 物件を一意に識別するコード |
| 沿線 | 物件から利用可能な沿線のうち代表的な沿線の名前 |
| 最寄駅 | 物件から利用可能な駅のうち代表的な駅の名前 |
| エアコン, オートロック, … | 当該設備が設置されているかどうかの有無を示す値 Y:設置あり, N:設置なし |

図の説明テキスト
表2 “物件” テーブルの主な統計情報
| テーブル名 | 行数 | 列名 | 列値個数 |
|---|---|---|---|
| 物件 | 1,600,000 | 物件コード | 1,600,000 |
| 沿線 | 400 | ||
| エアコン | 2 | ||
| オートロック | 2 |
- 検索システムの課題
Kさんは,社内利用者に聞き取り調査を行い,その結果を二つの課題にまとめた。
(1) “物件”テーブルの各設備の有無を示す列(以下,総称して設備列という)の数は不十分で,借主からの問合せに十分に対応できていない。追加したい設備は,テレワーク対応,宅配ボックス,追い焚き風呂などがあり,現在の 20 個を含め,全部で 100 個ある。将来,増える可能性がある。
(2) 設備の設置済個数が分からない。例えば,借主から物件に設置されているエアコンについて問合せがあったとき,設置されている正確な個数が分からず,別の詳細な物件設備台帳を調べなければならない。
〔物件の設備に関する調査及び課題への対応〕
- 物件の設備に関する調査
Kさんは,現在検索できる設備の組合せを述語に指定した SQL文を調査した。その SQL文の例を,表3に示す。そして Kさんは,SQL文の結果行を保存するファイルの所要量を見積もる目的で,表3の各SQL文の結果行数を見積もった。

図の説明テキスト
表3 設備の組合せを述語に指定したSQL文の例(未完成)
| SQL | SQL文の構文(上段:目的,下段:構文) | 見積もった結果行数 |
|---|---|---|
| SQL1 | 沿線が◯△線であり,かつ,設備にエアコンとオートロックの両方がある物件を調べる。 SELECT 物件コード, 物件名 FROM 物件 WHERE 沿線 = '◯△線' AND ( エアコン = 'Y' AND オートロック = 'Y' ) |
イ |
| SQL2 | 沿線が◯△線であり,かつ,設備にエアコン又はオートロックのいずれかがある物件を調べる。 SELECT 物件コード, 物件名 FROM 物件 WHERE 沿線 = '◯△線' AND ( エアコン = 'Y' OR オートロック = 'Y' ) |
ロ |
| SQL3 | 設備にエアコンとオートロックの両方がある物件を沿線ごとに集計した物件数が,全物件数に占める割合を百分率(小数点以下切捨て)で求める。 WITH TEMP ( TOTAL ) AS ( SELECT COUNT(*) FROM 物件 ) SELECT 沿線, FLOOR( ハ * 100 / ニ ) FROM 物件 CROSS JOIN TEMP WHERE エアコン = 'Y' AND オートロック = 'Y' GROUP BY ホ |
400 |
注記 FLOOR関数は, 引数以下の最大の整数を計算する。
- 物件の設備に関する課題への対応
Kさんは,物件の設備に関する課題に対応するため,次の2案について長所及び短所を比較した結果,案Bを採用することにした。
案A “物件”テーブルにエアコン台数列を追加する。
案B 追加・変更するテーブルのテーブル構造を,図2に示すとおりにする。
- “設備”テーブルを追加する。
- 図1に示した“物件”テーブルを“新物件”テーブルに置き換える。
- “物件設備”テーブルを追加する。

図の説明テキスト
図2 追加・変更するテーブルのテーブル構造
枠内に次のテーブル構造が記載されている。原図では主キーを構成する列名に実線の下線が付いており(破線の下線はない)、ここでは「(主キー)」と記す。
設備(設備コード(主キー),設備名)
新物件(物件コード(主キー),物件名,沿線,最寄駅,賃料,間取り,向き,専有面積,築年数,都道府県,市区町村,物件登録日)
物件設備(物件コード(主キー),設備コード(主キー),設置済個数)
設備コードは,全設備を一意に識別するコードで,そのうち20個は,“物件”テーブルの各設備列に対応させた。また,“設備”テーブルの設備名の列値に“物件”テーブルの設備列名をそのまま設定し,今後追加される設備名を含めて重複させないことに決めた。
- テーブルの移行
Kさんは,追加・変更するテーブルへの移行を,次のような手順で行った。
(1) “設備”,“新物件”及び“物件設備”テーブルを定義した。
(2) “物件”テーブルから設備列20個を除いた全行を,“新物件”テーブルに複写した。
(3) “設備”テーブルに100個の設備を登録した。エアコン又はオートロックを登録するSQL文の例を,表4のSQL4に示す。
(4) “物件設備”テーブルには“物件”テーブルにある設備に限って行を登録した。エアコン又はオートロックがある行を登録するSQL文の例を,表4のSQL5に示す。ここで,設置済個数列に1を設定し,正確な個数を移行後に設定することにした。
(5) テーブルの統計情報を取得した。主な統計情報を表5に示す。

図の説明テキスト
表4 “設備”テーブル又は“物件設備”テーブルに登録する SQL 文の例(未完成)
| SQL | SQL文の構文 |
|---|---|
| SQL4 | INSERT INTO 設備 VALUES ('A1', 'エアコン') INSERT INTO 設備 VALUES ('A2', 'オートロック') |
| SQL5 | INSERT INTO 物件設備 ( 物件コード, 設備コード, 設置済個数 ) SELECT a FROM 物件 WHERE b c SELECT d FROM 物件 WHERE e |

図の説明テキスト
表5 追加・変更したテーブルの主な統計情報(未完成)
| テーブル名 | 行数 | 列名 | 列値個数 |
|---|---|---|---|
| 設備 | 100 | 設備コード | 100 |
| 新物件 | 1,600,000 | 物件コード | 1,600,000 |
| 物件設備 | (網掛け) | 物件コード | あ |
| 設備コード | い | ||
| 注記 網掛け部分は表示していない。 |
〔テーブルの移行の検証〕
Kさんは,テーブルの移行を次のように検証し,新たなビューを定義した。
- SQL文の検証
テーブルの移行の前後でSQL文が同じ結果行を得るか検証するため,移行前のSQL文(表3のSQL1,SQL2)に対応する移行後のSQL文を,それぞれ表6のSQL6,SQL7のとおりに設計した。そして,“1. 物件の設備に関する調査”で保存したファイルを用いて,SQL1とSQL6の結果行,SQL2とSQL7の結果行がそれぞれ一致することを確認した。

図の説明テキスト
表6 移行後の SQL 文の例(未完成)
| SQL | SQL文の構文 |
|---|---|
| SQL6 | SELECT B.物件コード, B.物件名 FROM 新物件 B f 物件設備 BS1 ON B.物件コード = BS1.物件コード AND B.沿線 = '〇△線' g 設備 S1 ON BS1.設備コード = S1.設備コード AND h f 物件設備 BS2 ON B.物件コード = BS2.物件コード g 設備 S2 ON BS2.設備コード = S2.設備コード AND i |
| SQL7 | SELECT DISTINCT B.物件コード, B.物件名 FROM 新物件 B f 物件設備 BS ON B.物件コード = BS.物件コード AND B.沿線 = '〇△線' g 設備 S ON BS.設備コード = S.設備コード AND j |
- ビューの定義
Kさんは,“物件”テーブルの定義を削除した後でも実績のあるSQL文を変更することなく使いたいと考えている。そのために“物件”テーブルにあった沿線列,かつ,エアコン列とオートロック列の両方を表示するビュー“物件”を,図3のとおりに定義した。

図の説明テキスト
図3 ビュー “物件” の定義(未完成)
CREATE VIEW 物件 (物件コード, 沿線, エアコン, オートロック) AS
SELECT B.物件コード, B.沿線,
CASE WHEN <span id="q3_blank_k" class="blank-label">k</span> THEN <span id="q3_blank_l" class="blank-label">l</span> ELSE <span id="q3_blank_m" class="blank-label">m</span> END AS エアコン,
CASE WHEN [ 網掛け ] THEN <span id="q3_blank_l" class="blank-label">l</span> ELSE <span id="q3_blank_m" class="blank-label">m</span> END AS オートロック
FROM 新物件 B
<span id="q3_blank_n" class="blank-label">n</span> 物件設備 BS1 ON B.物件コード = BS1.物件コード AND <span id="q3_blank_o" class="blank-label">o</span>
<span id="q3_blank_n" class="blank-label">n</span> 物件設備 BS2 ON B.物件コード = BS2.物件コード AND [ 網掛け ]
注記 網掛け部分は表示していない。
設問と解答・解説
設問1
〔物件の設備に関する調査及び課題への対応〕について,(1)〜(4)に答えよ。
表3中の 空欄 イ に入れる適切な数値を答えよ。ここで,沿線,エアコン,オートロックの列値の分布は互いに独立し,各列の列値は一様分布に従うと仮定すること。
模範解答
1,000
解説
- 表2の統計情報より、「物件」テーブルの全行数は 行である。
- 各列の列値は一様分布に従うと仮定されており、列値は互いに独立している。
- 列「沿線」の列値個数は なので、特定の沿線('◯△線')である確率は 。
- 列「エアコン」の列値個数は ('Y', 'N')なので、'Y'である確率は 。
- 列「オートロック」の列値個数は ('Y', 'N')なので、'Y'である確率は 。
- SQL1のWHERE句は
沿線 = '◯△線' AND ( エアコン = 'Y' AND オートロック = 'Y' )であり、すべての条件がANDで結ばれている。 - これらの条件を同時に満たす確率は、 となる。
- したがって、見積もった結果行数は 行となる。
表3中の 空欄 ロ に入れる適切な数値を答えよ。ここで,沿線,エアコン,オートロックの列値の分布は互いに独立し,各列の列値は一様分布に従うと仮定すること。
模範解答
3,000
解説
- 表2の統計情報より、「物件」テーブルの全行数は 行である。
- 各列の列値は一様分布に従い独立している。
- 沿線が'◯△線'である確率は 。
- SQL2のWHERE句の条件は
沿線 = '◯△線' AND ( エアコン = 'Y' OR オートロック = 'Y' )である。 エアコン = 'Y' OR オートロック = 'Y'を満たす確率を求める。エアコンが'Y'の確率は 、オートロックが'Y'の確率は 。両方が'Y'の確率は 。- したがって、少なくとも一方が'Y'である確率は となる。
- これらは独立しているため、WHERE句全体を満たす確率は となる。
- したがって、見積もった結果行数は 行となる。
表3中の 空欄 ハ に入れる適切な字句を答えよ。ここで,沿線,エアコン,オートロックの列値の分布は互いに独立し,各列の列値は一様分布に従うと仮定すること。
模範解答
COUNT(*)
採点基準
- 1点: 行数を集計するための関数が必要であることを理解している
- 0点: 上記を満たさない
- 1点: COUNT(*) のように正しい構文で記述されている
- 0点: 上記を満たさない
解説
- SQL3は、「設備にエアコンとオートロックの両方がある物件を沿線ごとに集計した物件数が,全物件数に占める割合を百分率(小数点以下切捨て)で求める」クエリである。
- メインのSELECT文では、
WHERE エアコン = 'Y' AND オートロック = 'Y'で絞り込み、GROUP BY ホ(沿線) で沿線ごとにグループ化している。 - 百分率を求める式
FLOOR( ハ * 100 / ニ )において、「ハ」は分子となる「沿線ごとの条件を満たす物件数」である必要がある。 - グループ内の行数を数える集計関数は
COUNT(*)である。したがって、「ハ」にはCOUNT(*)が入る。
高得点のポイント
- 集計関数の目的を理解していること
- 行数を数えるための正しい記述となっていること
表3中の 空欄 ニ に入れる適切な字句を答えよ。ここで,沿線,エアコン,オートロックの列値の分布は互いに独立し,各列の列値は一様分布に従うと仮定すること。
模範解答
TOTAL
採点基準
- 1点: 割合を求めるための分母として全物件数を参照する必要があることを理解している
- 0点: 上記を満たさない
- 1点: TEMPテーブルの列名である TOTAL を正しく指定している
- 0点: 上記を満たさない
解説
- SQL3の百分率を計算する数式
FLOOR( ハ * 100 / ニ )において、「ニ」には分母となる「全物件数」が入る必要がある。 - 全物件数は、先行する
WITH句で定義されたTEMPテーブルのTOTAL列としてSELECT COUNT(*) FROM 物件により計算されている。 - メインのクエリでは
CROSS JOIN TEMPによりこのTOTAL列が全ての行に結合されているため、分母としてTOTALを参照できる。 - したがって、「ニ」には
TOTALが入る。
高得点のポイント
- 割合を求めるための分母として全物件数が必要であることを理解していること
- TEMPテーブルの列名である TOTAL を正しく指定していること
表3中の 空欄 ホ に入れる適切な字句を答えよ。ここで,沿線,エアコン,オートロックの列値の分布は互いに独立し,各列の列値は一様分布に従うと仮定すること。
模範解答
沿線,TOTAL
採点基準
- 1点: GROUP BY句にはSELECT句に指定された非集計列をすべて含める必要があるというSQLの仕様を理解している
- 0点: 上記を満たさない
- 1点: 「沿線」と「TOTAL」の両方が正しい構文で列挙されている
- 0点: 上記を満たさない
解説
- SQL3では「沿線ごとに集計した物件数」を求めるため、集計のキーとなる
沿線でグループ化する必要がある。 - さらに、集計関数(
COUNT(*))を使用するクエリにおいて、SELECT句に指定した列のうち、集計関数に含まれない列はすべてGROUP BY句に指定するというSQLの仕様がある。 - SELECT句には
沿線とTOTAL(数式内の分母)が指定されているため、GROUP BYにも沿線とTOTALの両方を含める必要がある。 - したがって、「ホ」には
沿線, TOTAL(または沿線,TOTAL)が入る。
高得点のポイント
- GROUP BY句にはSELECT句に指定された非集計列をすべて含める必要があるというSQLの仕様を理解していること
- 沿線 と TOTAL の両方が正しい構文で列挙されていること
“2. 物件の設備に関する課題への対応”について,Kさんが採用した案Bの長所を一つ,本文中の用語を用いて,25字以内で具体的に述べよ。
模範解答
物件設備の入替処理が不要である。
全設備の有無と個数の問合せに答えられる。
将来,増える設備に対して行追加で対応できる。
採点基準
- 2点: 入替処理の不要化、設置済個数の管理、設備の追加への対応容易性のいずれかの長所を正しく抽出できている
- 1点: 長所の一部を抽出できているが、具体性に欠ける
- 0点: 上記を満たさない
- 1点: 本文中の用語(「物件設備の入替処理」「設置済個数」など)を用いて、論理的に記述されている
- 0点: 上記を満たさない
解説
- 「2. 物件の設備に関する課題への対応」における案Bは、設備の管理を列から行(「設備」テーブルと「物件設備」テーブル)へと正規化する設計である。
- これにより、本文中の課題に対応して以下のいずれかの長所が考えられる。
- 課題「(1) … 全部で 100 個ある。将来,増える可能性がある」に対して、新しい設備は「設備」テーブルと「物件設備」テーブルへの 行の追加 で対応でき、テーブル定義の変更が不要になる。
- 「検索システムの概要」2.(5) の「テーブルの定義を変更し,記録する人気の設備を毎年入れ替える処理を行っている。この処理を物件設備の入替処理と呼んでいる」について、全ての設備を保持できるようになるため、この 物件設備の入替処理が不要 になる。
- 課題「(2) 設備の設置済個数が分からない。」に対して、「物件設備」テーブルに「設置済個数」列を持たせることで、全ての設備の正確な設置個数を管理でき、問合せに答えられるようになる。
- いずれか一つを、指定された字数と本文中の用語を用いて解答する。
高得点のポイント
- 案Bの採用によって解決される課題(入替処理の不要化、設置済個数の管理、設備の追加への対応容易性)のいずれかの長所を正しく抽出できていること
- 本文中の用語を用いて、文意が通るように論理的に記述されていること
表4中の 空欄 a に入れる適切な字句を答えよ。
模範解答
物件コード, 'A1',1
物件コード, 'A2',1
採点基準
- 1点: 「物件コード, 'A1', 1」又は「物件コード, 'A2', 1」が指定されている(1つ目の SELECT をエアコン・オートロックのどちらにしてもよい)。
- 0点: 上記を満たさない。
- 1点: 選択リストの並び(物件コード, 設備コード, 設置済個数)が INSERT の列の並びと合っている。空白・引用符の全角半角は問わない。
- 0点: 上記を満たさない。
解説
- SQL5は「物件設備」テーブルにデータを登録する処理であり、挿入先の列構成は
(物件コード, 設備コード, 設置済個数)である。 - 最初のSELECT文はエアコンに関するデータを旧「物件」テーブルから抽出して登録する。
- 登録すべきデータは、「物件コード」、エアコンの設備コード(表4のSQL4より
'A1')、「設置済個数」である。 - 「3. テーブルの移行」(4) に「設置済個数列に1を設定し」とあるため、個数として固定値の
1を指定する。 - したがって、「a」には挿入先の列に対応する
物件コード, 'A1', 1が入る。 - なお、a・b の組と d・e の組は入れ替えてもよい(公式解答例の備考「順不同」)。
高得点のポイント
- 挿入先に対応した値を正しく指定できていること
- SQLのSELECT句として正しい構文で記述されていること
表4中の 空欄 c に入れる適切な字句を答えよ。
模範解答
UNION ALL
採点基準
- 1点: 複数のSELECT文の結果を結合して和集合を求める演算子が必要であることを理解している
- 0点: 上記を満たさない
- 1点: 効率的な UNION ALL を用いて記述できている
- 0点: 上記を満たさない
解説
- SQL5において、エアコンとオートロックに関する2つのSELECT文の結果を合わせて「物件設備」テーブルに挿入する。
- そのため、二つのSELECT文の結果行の和集合を求める演算子が必要である。
- 設備コードが 'A1' と 'A2' で異なるため結果行に重複は発生せず、重複排除を伴わない
UNION ALLを使用するのが適切である。(UNIONでも動作するが、より効率的なUNION ALLが期待される) - したがって、「c」には
UNION ALLが入る。
高得点のポイント
- 複数のSELECT文の結果を結合して和集合を求める演算子が必要であることを理解していること
- 重複排除が不要なため効率的な UNION ALL を用いて記述できていること
表4中の 空欄 d に入れる適切な字句を答えよ。
模範解答
物件コード, 'A1',1
物件コード, 'A2',1
採点基準
- 1点: 1つ目の解答(空欄a)で使っていない方の設備コードの組(a が 'A1' なら「物件コード, 'A2', 1」、'A2' なら「物件コード, 'A1', 1」。a が誤答・無解答ならどちらか一方で可)が指定されている。
- 0点: a と同じ設備コード、または上記を満たさない。
- 1点: 選択リストの並び(物件コード, 設備コード, 設置済個数)が INSERT の列の並びと合っている。空白・引用符の全角半角は問わない。
- 0点: 上記を満たさない。
解説
- 2つ目のSELECT文はオートロックに関するデータを旧「物件」テーブルから抽出して登録する処理である。
- 登録すべきデータは、「物件コード」、オートロックの設備コード(表4のSQL4より
'A2')、「設置済個数」である。 - aと同様に、「設置済個数列に1を設定し」とあるため、個数として固定値の
1を指定する。 - したがって、「d」には挿入先の列に対応する
物件コード, 'A2', 1が入る。 - なお、a・b の組と d・e の組は入れ替えてもよい(公式解答例の備考「順不同」)。
高得点のポイント
- 挿入先に対応した値を正しく指定できていること
- SQLのSELECT句として正しい構文で記述されていること
表4中の 空欄 b に入れる一つの適切な述語を答えよ。
模範解答
エアコン='Y'
オートロック='Y'
採点基準
- 1点: 1つ目の解答(空欄a)に対応する述語(a が 'A1' なら「エアコン='Y'」、'A2' なら「オートロック='Y'」。a が誤答・無解答ならどちらか一方で可)が指定されている。
- 0点: a と対応しない述語、または上記を満たさない。
- 1点: 一つの比較述語として正しく記述されている。
- 0点: 上記を満たさない。
解説
- 最初のSELECT文はエアコンについてのデータを登録するため、エアコンがある行だけを旧「物件」テーブルから抽出する必要がある。
- 表1の制約より、旧「物件」テーブルにおいてエアコンが設置されていることを示す条件は
エアコン = 'Y'である。 - したがって、絞り込み条件であるWHERE句の「b」には
エアコン = 'Y'が入る。 - なお、a・b の組と d・e の組は入れ替えてもよい(公式解答例の備考「順不同」)。
高得点のポイント
- エアコンが設置されている条件を旧テーブルの列から正しく導出できていること
- SQLのWHERE句として正しい比較述語で記述されていること
表4中の 空欄 e に入れる一つの適切な述語を答えよ。
模範解答
エアコン='Y'
オートロック='Y'
採点基準
- 1点: 空欄dに対応する述語(d が誤答・無解答なら 1つ目の解答(空欄b)と異なる方で可)が指定されている。
- 0点: b と同じ述語、または上記を満たさない。
- 1点: 一つの比較述語として正しく記述されている。
- 0点: 上記を満たさない。
解説
- 2つ目のSELECT文はオートロックについてのデータを登録するため、オートロックがある行だけを旧「物件」テーブルから抽出する必要がある。
- 表1の制約より、旧「物件」テーブルにおいてオートロックが設置されていることを示す条件は
オートロック = 'Y'である。 - したがって、絞り込み条件であるWHERE句の「e」には
オートロック = 'Y'が入る。 - なお、a・b の組と d・e の組は入れ替えてもよい(公式解答例の備考「順不同」)。
高得点のポイント
- オートロックが設置されている条件を旧テーブルの列から正しく導出できていること
- SQLのWHERE句として正しい比較述語で記述されていること
表5中の 空欄 あ に入れる適切な数値を答えよ。
模範解答
1,600,000
解説
- 表5の空欄「あ」は、「物件設備」テーブルに存在する「物件コード」の列値個数(異なり数)を求めている。
- 「3. テーブルの移行」(4)より、「物件設備」テーブルには旧「物件」テーブルにある設備に限って行を登録している。
- 「物件設備」テーブルは物件と設備の組ごとに行をもつので、物件コードの列値個数は、いずれかの設備がある物件の数になる。
- 本文に設備が一つも無い物件の記述は無く、公式解答はすべての物件(1,600,000 件)がいずれかの設備をもつものとしている。
- したがって、物件コードの列値個数は全物件数と同じ 1,600,000 となる。
表5中の 空欄 い に入れる適切な数値を答えよ。
模範解答
20
解説
- 表5の空欄「い」は、「物件設備」テーブルに存在する「設備コード」の列値個数(異なり数)を求めている。
- 「3. テーブルの移行」の手順(4)で「“物件設備”テーブルには“物件”テーブルにある設備に限って行を登録した」と指定されている。
- 旧「物件」テーブルで管理されていた設備は、〔検索システムの概要〕2.(3)および入替処理の記述より、20個である。
- 〔検索システムの概要〕2.(4)に「どの設備もいずれかの物件に設置されている」とあり、物件テーブルの 20 個の設備コードがすべて“物件設備”に現れるので 20 となる。
- 「設備」テーブル自体には100個の設備が新規登録されたが、初期移行として「物件設備」テーブルに登録されたのは旧テーブルに存在した20個の設備のみである。
- したがって、「設備コード」の列値個数は 20 となる。
設問1(3)は,正答率は平均的であったが,cにUNION ALLと解答すべきところを,AND又はORとする誤答が散見された。二つのSELECT文の結果行の和集合を求めていることに留意し,正答を導き出してほしい。 設問1(4)では,追加した“物件設備”テーブルの物件コード及び設備コードの列値個数を,状況記述から読み取ることを求めたが,前者に比べて後者の正答率が低かった。テーブルの行数だけでなく列値個数も,テーブルの物理設計及び性能見積り,及び性能改善に欠かせない基本的な統計情報の一つなので,よく理解してほしい。
設問2
〔テーブルの移行の検証〕について,(1)〜(3)に答えよ。
表6中の 空欄 f に入れる適切な字句を答えよ。
模範解答
INNER JOIN
採点基準
- 1点: 条件を満たす物件のみを抽出するためには内部結合が必要であることを理解している
- 0点: 上記を満たさない
- 1点: 正しい結合演算子 INNER JOIN(または JOIN)を指定できている
- 0点: 上記を満たさない
解説
- SQL6は表3のSQL1(エアコンとオートロックの両方がある物件)の移行後SQLである。
- 移行後は「新物件」テーブルに対して「物件設備」テーブルを結合し、条件に合致する物件だけを抽出する必要がある。
- 指定した設備(エアコン)を持つ物件のみを残すため、結合対象のテーブルに存在する行だけを絞り込んで抽出する内部結合を使用する。
- したがって、「f」には
INNER JOIN(またはJOIN)が入る。
高得点のポイント
- 条件を満たす物件のみを抽出するためには内部結合が必要であることを理解していること
- 正しい結合演算子 INNER JOIN を指定できていること
表6中の 空欄 g に入れる適切な字句を答えよ。
模範解答
INNER JOIN
採点基準
- 1点: 条件を満たす設備のみを抽出するためには内部結合が必要であることを理解している
- 0点: 上記を満たさない
- 1点: 正しい結合演算子 INNER JOIN(または JOIN)を指定できている
- 0点: 上記を満たさない
解説
fと同様に、「物件設備」テーブルに紐づく「設備」テーブルを結合し、特定の設備であることを条件に絞り込む必要がある。- 条件に合致する設備のみを残すため、内部結合を使用する。
- したがって、「g」にも
INNER JOIN(またはJOIN)が入る。
高得点のポイント
- 条件を満たす設備のみを抽出するためには内部結合が必要であることを理解していること
- 正しい結合演算子 INNER JOIN を指定できていること
表6中の 空欄 h に入れる適切な字句を答えよ。
模範解答
S1.設備名='エアコン'
S1.設備コード='A1'
S1.設備名='オートロック'
S1.設備コード='A2'
採点基準
- 1点: 相関名 S1 でエアコン又はオートロックのどちらか一方を指定している(設備名='エアコン'/設備コード='A1'、設備名='オートロック'/設備コード='A2'。設備名・設備コードのどちらでも可)。
- 0点: 上記を満たさない。
- 1点: 列名を S1 で修飾している。
- 0点: 上記を満たさない。
解説
- SQL6はエアコンとオートロックの両方がある物件を求める。
- 1つ目の結合先である設備テーブルのエイリアス
S1に対して、その設備が「エアコン」であるという条件を指定する必要がある。 - SQL6 では“設備”テーブルを S1・S2 の2回結合しており、どちらの表の列かを区別するため相関名で修飾する必要があるので、テーブルエイリアスを用いて
S1.設備名 = 'エアコン'(またはS1.設備コード = 'A1')のように記述する。 - したがって、「h」には
S1.設備名 = 'エアコン'が入る。 - なお、h・i は入れ替えてもよい(公式解答例の備考「順不同」)。
高得点のポイント
- 抽出したい設備(エアコン)を絞り込む条件を正しく導出できていること
- 列名を正しい相関名(エイリアス S1)で修飾して記述できていること
表6中の 空欄 i に入れる適切な字句を答えよ。
模範解答
S2.設備名='オートロック'
S2.設備コード='A2'
S2.設備名='エアコン'
S2.設備コード='A1'
採点基準
- 1点: 相関名 S2 で、1つ目の解答(空欄h)と異なるもう一方の設備を指定している(h が誤答・無解答ならどちらか一方で可)。
- 0点: h と同じ設備、または上記を満たさない。
- 1点: 列名を S2 で修飾している。
- 0点: 上記を満たさない。
解説
- SQL6において、2つ目の結合先である設備テーブルのエイリアス
S2に対しては、その設備が「オートロック」であるという条件を指定する必要がある。 - したがって、「h」と同様にテーブルエイリアスを用いて
S2.設備名 = 'オートロック'(またはS2.設備コード = 'A2')のように記述する。 - これにより、エアコンとオートロックの両方を持つ物件のみが結果として残る。
- なお、h・i は入れ替えてもよい(公式解答例の備考「順不同」)。
高得点のポイント
- 抽出したい設備(オートロック)を絞り込む条件を正しく導出できていること
- 列名を正しい相関名(エイリアス S2)で修飾して記述できていること
表6中の 空欄 j に入れる適切な字句を答えよ。
模範解答
(S.設備名='エアコン' OR S.設備名='オートロック')
(S.設備コード='A1' OR S.設備コード='A2')
採点基準
- 1点: エアコンとオートロックのどちらかに合致する条件を OR(又は IN)で指定している。
- 0点: 上記を満たさない。
- 1点: 列名を相関名 S で修飾し、OR 条件全体を括弧でくくっている(「S.設備名 IN ('エアコン', 'オートロック')」等の IN 述語も同値なので可)。
- 0点: 括弧なしの OR、または上記を満たさない。
解説
- SQL7は表3のSQL2(エアコン又はオートロックのいずれかがある物件)の移行後SQLである。
- 内部結合において、設備の条件として「エアコン又はオートロック」のどちらかに合致するものを抽出する。
- したがって、OR論理演算子を用いて
(S.設備名 = 'エアコン' OR S.設備名 = 'オートロック')(設備コードでの指定も可)のように記述する。 - AND条件がOR条件より優先されるため、OR条件全体を括弧でくくる必要がある。
- ここでも相関名
Sによる列名の修飾が必要である。
高得点のポイント
- 「いずれか」という条件を満たすためにOR論理演算子が必要であることを理解していること
- 列名を正しい相関名(エイリアス S)で修飾し、構文として正しいOR条件を記述できていること
表6中のSQL7の選択リストにあるDISTINCTの目的は,結果行の重複を排除するためである。このSQL7で行が重複するのはどのような場合か。本文中の用語を用いて,30字以内で具体的に述べよ。
模範解答
エアコンとオートロックの両方が設置されている場合
採点基準
- 2点: 条件に合致する設備が複数あるメカニズムを理解し、「エアコンとオートロックの両方が設置されている場合」という条件を特定できている
- 1点: 重複が発生する理由について言及しているが、条件の特定が不十分である
- 0点: 上記を満たさない
- 1点: 本文中の用語(「エアコン」「オートロック」「設置されている」など)を用いて、文意が通るように論理的に記述されている
- 0点: 上記を満たさない
解説
- SQL7は「新物件」テーブルに「物件設備」と「設備」を結合し、設備が「エアコン又はオートロック」である物件を検索している。
- 1つの物件に対して条件に合致する「物件設備」の行が複数存在する場合、テーブル結合(1対多の結合)の性質上、「新物件」側の同じ物件行が複製されて出力されてしまう。
- 具体的には、結合条件
j(S.設備名 = 'エアコン' OR S.設備名 = 'オートロック') を満たす設備が2つとも存在する場合、つまり「エアコンとオートロックの両方が設置されている場合」に、1つの物件に対して結果行が2行生成され重複する。 - そのため
DISTINCTを用いて重複を排除している。
高得点のポイント
- 1対多のテーブル結合において、条件に合致する設備が複数ある場合に結果行が重複するメカニズムを理解していること
- 本文中の用語を用いて、文意が通るように論理的に記述されていること
図3中の 空欄 k に入れる適切な字句を答えよ。
模範解答
BS1.設備コード='A1'
BS1.設備コード IS NOT NULL
採点基準
- 1点: 外部結合の結果から、設備が存在するかどうかを判定するための条件を正しく導出できている
- 0点: 上記を満たさない
- 1点: 相関名を用いた正しいSQL述語(IS NOT NULL や 'A1' との比較)で記述できている
- 0点: 上記を満たさない
解説
- 図3のビュー定義において、SELECT句の
CASE文は、エアコンが設置されているかどうかで返す値を分岐させている。 - 外部結合(LEFT OUTER JOIN)を用いているため、物件にエアコンが設置されていない場合は
BS1側の列値はすべてNULLとなる。 - 設置されている場合は、結合条件(
BS1.設備コード = 'A1')により値が存在する。 - したがって、エアコンが設置されているかどうかの判定条件として、「k」には
BS1.設備コード = 'A1'やBS1.設備コード IS NOT NULLなどが入る。
高得点のポイント
- 外部結合の結果から、設備が存在するかどうかを判定するための条件を正しく導出できていること
- 相関名を用いた正しいSQL述語で記述できていること
図3中の 空欄 l に入れる適切な字句を答えよ。
模範解答
'Y'
採点基準
- 1点: 設備が設置されていることを示すデータ値 'Y' を旧テーブルの仕様から正しく特定できている
- 0点: 上記を満たさない
- 1点: 文字列リテラルとして正しく記述できている
- 0点: 上記を満たさない
解説
CASE文で条件kを満たした(エアコンが設置されている)場合に返す値である。- 表1「“物件” テーブルの主な列の意味・制約」より、当該設備が設置されていることを示す値は
'Y'である。 - したがって、「l」には
'Y'が入る。
高得点のポイント
- 設備が設置されていることを示すデータ値を旧テーブルの仕様から正しく特定できていること
- 文字列リテラルとして正しく(シングルクォーテーションで囲んで)記述できていること
図3中の 空欄 m に入れる適切な字句を答えよ。
模範解答
'N'
採点基準
- 1点: 設備が設置されていないことを示すデータ値 'N' を旧テーブルの仕様から正しく特定できている
- 0点: 上記を満たさない
- 1点: 文字列リテラルとして正しく記述できている
- 0点: 上記を満たさない
解説
CASE文で条件kを満たさない(エアコンが設置されていない)場合に返す値である。- 表1「“物件” テーブルの主な列の意味・制約」より、当該設備が設置されていないことを示す値は
'N'である。 - したがって、「m」には
'N'が入る。
高得点のポイント
- 設備が設置されていないことを示すデータ値を旧テーブルの仕様から正しく特定できていること
- 文字列リテラルとして正しく(シングルクォーテーションで囲んで)記述できていること
図3中の 空欄 n に入れる適切な字句を答えよ。
模範解答
LEFT OUTER JOIN
採点基準
- 1点: 設備が設置されていない物件も結果行として残すために外部結合(左外結合)が必要であることを理解している
- 0点: 上記を満たさない
- 1点: 正しい結合演算子 LEFT OUTER JOIN(または LEFT JOIN)を指定できている
- 0点: 上記を満たさない
解説
- このビューは旧「物件」テーブルの構造を再現するものであり、エアコンやオートロックが設置されていない物件(値が
'N'になる物件)も結果に含める必要がある。 INNER JOIN(内部結合)を使用すると、その設備を持たない物件の行が結果から消滅してしまう。- ベースとなる「新物件 B」の全行を保持しつつ、該当する「物件設備」の情報を結合するには、左外部結合を使用する必要がある。
- したがって、「n」には
LEFT OUTER JOIN(またはLEFT JOIN)が入る。
高得点のポイント
- 設備が設置されていない物件も結果行として残すために外部結合が必要であることを理解していること
- 正しい結合演算子 LEFT OUTER JOIN を指定できていること
図3中の 空欄 o に入れる適切な字句を答えよ。
模範解答
BS1.設備コード='A1'
採点基準
- 1点: エアコンの設備情報を結合するための条件(設備コードが'A1')を正しく導出できている
- 0点: 上記を満たさない
- 1点: 列名を正しい相関名(エイリアス BS1)で修飾して記述できている
- 0点: 上記を満たさない
解説
BS1はエアコンに関する情報を結合するためのテーブルエイリアスである。- エアコンの情報を正しく結びつけるには、結合の
ON条件として「物件設備」テーブル側の設備コードがエアコンのもの(表4より'A1')であることを指定する必要がある。 - したがって、「o」には
BS1.設備コード = 'A1'が入る。
高得点のポイント
- エアコンの設備情報を結合するための条件(設備コードが'A1')を正しく導出できていること
- 列名を正しい相関名(エイリアス BS1)で修飾して記述できていること
設問2(1)は,正答率が平均的であった。表3のSQL1及びSQL2のWHERE句中の述語を手掛かりに,h~jに入れる適切な述語を導くことができる。ただし,表6のSQL文の構文中に設備コードを参照する場合,どのテーブルの設備コードを参照するかのあいまいさを排除するため,相関名で列名を修飾しなければならないことに注意してほしい。 設問2(3)では,左外結合を選択できるかを問うたが,正答率が低かった。“3.テーブルの移行”において,エアコン又はオートロックがある物件を“物件設備”テーブルに登録していること,及びビュー“物件”のエアコン列又はオートロック列の列値が‘N’の行を求めることに留意し,正答を導き出してほしい。