DBデータベーススペシャリスト試験 午後Ⅰ
平成21年度春期 データベーススペシャリスト 午後Ⅰ 問3
事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。
問題





![図3 現在日付の顧客属性情報を1行読み込むSQL文。SELECT * FROM 顧客 WHERE 顧客コード=:顧客コード AND 適用開始日<=CURRENT_DATE AND ( [a] OR [b] ) の形のSQL文。空欄a,bの枠を含む。](/figures/b65c0fbfef335a7287918c184836c5b957283fcf7e481146e72702057ef5ac72.webp)

![図4 顧客属性情報の優遇レベルが変更された日を調べるSQL文。顧客X,顧客Yを自己結合し,X.顧客コード=Y.顧客コード,[c]=Y.変更連番,[d]<>Y.優遇レベルを条件にY.顧客コード,Y.適用開始日,Y.優遇レベルを求めるSQL文。空欄c,dを含む。](/figures/a5a3b4f183d41ebf6b233cbab4c54274201093a0d19438bb81f56993472142a1.webp)







解き方のヒントを見る
適用期間の定義に照らして条件を読む
履歴管理では、ある時点で有効な行がどれかを決める規則が設計の中心になります。照会や検証の条件を評価する前に、その設計が適用期間の始まりと終わりをどう定めているかを確かめ、条件がその定めと一致しているかを一つずつ照合しましょう。
この問題で問われていること
焦点は、適用期間の境界を設計がどう表しているかという一点です。期間の端に当たる日付や、終わりがまだ決まっていない状態の表し方を自分の言葉で整理し、照会や検証の記述がその整理と矛盾しないかを確かめてください。
視点
履歴管理テーブルでは、同じ対象について時間の区切りごとに複数の行が存在します。ある時点にどの行が該当するかは、期間の端点を含めるかどうかという約束事で決まります。この約束事は設計ごとに定められるものです。まずその設計の約束事を確認し、それを基準に各記述を読むことが大切です。
確認ポイント
- 設計の説明から、期間の始まりと終わりの端点がそれぞれ含まれるかどうかを読み取れたか
- 終わりが未確定の期間がどのように表されているかを確認したか
- 各記述の条件を、読み取った期間の定義と一つずつ照らし合わせたか
正解と解説を見る
解説
適用開始日と適用終了日で変更履歴を管理する“顧客”テーブルを題材に、ある日付に有効な行の検索、自己結合による変化点の抽出、期間が連続しているかの検証、先日付変更で起きる期間の重なりや受付日の記録漏れ、既存の集計SQLで期間条件を誤った場合の影響を問う問題です。出題趣旨では、履歴特有のデータ整合性を考えた実装能力と、設計変更が既存SQLに与える影響を見極める能力が狙いとされています。
問題の全体像
H銀行では、“顧客”テーブルに変更連番・適用開始日・適用終了日を追加して、顧客属性情報の変更履歴を残すことにしました。適用終了日がNULLなら現在も有効な行で、顧客コードが削除されたときは削除日付が入ります。その後、優遇レベルを20日〜月末のバッチで設定し、翌月1日から適用する先日付変更を採り入れます。また、顧客情報管理部門から変更受付日を漏れなく記録したいという要望も出ます。G部長は、①適用期間の連続性、②先日付変更、③受付日の記録、④図5の集計SQLの誤り、の4点を指摘しました。出題趣旨によると、この問題の狙いは次の3点です。(1)履歴テーブルに求められる機能と運用要件を理解しているか。(2)履歴特有の整合性を考慮して実装できるか。(3)既存SQLへの影響を見極められるか。
設問1(1)(a)
図3は、現在日付に有効な1行を取り出すSQLです。条件『適用開始日<=CURRENT_DATE』はすでにあるので、残りは『適用終了日が今日以降』か『まだ終了していない(NULL)』かの判定です。公式解答例では、a を『適用終了日>=CURRENT_DATE』または『適用終了日=CURRENT_DATE』としています。先日付変更を導入する前は、変更は依頼当日から適用され、前の行の終了日は前日になります。削除の場合も終了日は削除日です。そのため、終了日が今日より後の日付になることはなく、『=』でも『>=』でも同じ結果になります。備考には『順不同』とあり、a と b は入れ替えて答えてもかまいません。
設問1(1)(b)
終了日が決まっていない最新の行は、適用終了日がNULLです。公式解答例では b を『適用終了日 IS NULL』としています。NULLは『=NULL』では比較できないので、必ず IS NULL と書きます。採点講評の画像でも、IS NULL と =NULL という語句が並んで取り上げられており、NULL比較の書き方が採点のポイントになっていることがうかがえます。これを a と OR でつなぐと、『今日時点で有効な行』を1行だけ取り出せます。
設問1(2)(c)
図4は“顧客”を X と Y の別名で自己結合し、同じ顧客の『ある行』と『その次の行』を比べるSQLです。変更連番は1から始まり、1ずつ増え、抜けがない(表2)ので、次の行は変更連番が1大きい行です。したがって、公式解答例の c は『X.変更連番 + 1』(=Y.変更連番)です。表3の C333333 では、変更連番2の行と3の行が対応します。
設問1(2)(d)
欲しいのは、優遇レベルが変わった行(Y側)の適用開始日です。前の行 X と次の行 Y の優遇レベルが異なる組を選べばよいので、公式解答例の d は『X.優遇レベル』(<>Y.優遇レベル)です。表3の C333333 では、変更連番2の優遇レベルは1、変更連番3は2です。そのため Y=変更連番3の行が選ばれ、表4の『2009-02-01、2』という結果になります。電話番号だけが変わった変更連番1→2の組は、優遇レベルが同じなので除かれます。
設問2(1)(e)
期間の連続性を確かめるには、行 X と、同じ顧客の次の行 Y を対応させます。副問合せでは『[c]=Y.変更連番』で次の連番と対応させており、さらに同じ顧客であることを条件にする必要があります。そのため、公式解答例の e は『X.顧客コード』(=Y.顧客コード)です。X.適用終了日 IS NOT NULL と EXISTS を組み合わせているので、次の行がない削除行や最新行は対象外になります。これで『適用終了日がNULLでも削除日付でもない行』だけを検査できます。
設問2(1)(f)
期間が連続している状態とは、『X の適用終了日の翌日=次の行 Y の適用開始日』が成り立つ状態です。この等式が成り立たない行を読み込めばよいので、NEXT_DAY(X.適用終了日) と比べる f は、公式解答例のとおり『Y.適用開始日』です。『<>』なので、日にちの抜けも重なりも同じように検出できます。
設問2(2)
追加後の C333333 の行で、CURRENT_DATE=2009-05-25 のときに図3の条件を満たす行を数えます。
・変更連番3(2009-02-01〜2009-05-31):開始日≦5/25、終了日≧5/25なので該当する。
・変更連番5(2009-05-25〜2009-05-31):開始日=5/25、終了日≧5/25なので該当する。
2行の期間が重なっているため、1行を読み込むはずの図3のSQLで複数行が返ります。公式解答例は『結果行が複数行になる。』または『SQL文の実行が失敗する。』です(1行を取得する前提の処理では、複数行が返ると実行エラーになるためです)。15字以内なら『結果行が複数行になる』程度にまとめます。
設問2(3)(g)
適用順番を『適用開始日の順番』とし、期間の連続性制約を加えます。すると、5/25の電話番号変更は3番目の期間(2/1〜5/31)を5/24で打ち切り、5/25〜5/31の新しい行を差し込む形になります。この行は、5/25からの新しい電話番号を反映します。したがって、公式解答例の g は『333-3333』です。
設問2(3)(h)
5/25〜5/31の期間の優遇レベルは、先日付変更(6/1適用)の前なので、まだ変わっていません。直前の期間と同じ値のままです。公式解答例の h は『2』です。
設問2(3)(i)
6/1からの行は、もともと表5の変更連番4(電話番号333-2222、優遇レベル3)でした。しかし、5/25の電話番号変更は6/1以降にも引き継ぐ必要があります。先日付の行をそのままにすると、6/1から古い電話番号に戻ってしまいます。そのため公式解答例の i は『333-3333』です。先日付の行がすでにある状態で属性を変更するときは、未来の行も更新しなければならないことが、この小問の要点です。
設問2(3)(j)
6/1からは、5/20に先日付で設定した新しい優遇レベルが適用されます。公式解答例の j は『3』です。この結果、6/1の行には『電話番号の変更(5/25受付)』と『優遇レベルの設定(5/20)』という2つの異なる変更が同居することになり、これが設問2(4)につながります。
設問2(4)
変更受付日の列は1行に1つしか持てません。公式解答例は次の2つを挙げています。
①同じ適用開始日に、変更受付日の異なる顧客属性情報が存在する場合。設問2(3)の6/1の行のように、優遇レベルの設定日と電話番号の受付日が1行にまとまり、どちらかの受付日が残らなくなります。
②先日付で設定した適用開始日より前に顧客コードを削除する場合。未来の行がなくなるか、その行の適用自体が成立しなくなり、先日付変更の受付日が記録されずに消えてしまいます。
答案では、35字以内で『1行に受付日が複数ある状況』または『先日付の行が無効になる状況』のどちらかを具体的に書きます。
設問3
図5の期間条件は『適用開始日≧4/1』かつ『適用終了日≦4/30 または NULL』です。4月に有効な行ではなく、4月中に開始した行を選ぶ条件になっているため、4月以前から有効な行が漏れます。さらに、取引日とその行の適用期間を対応させていません。そのため、条件を満たす行が1顧客に複数あると、その顧客の4月の預入が行の数だけ重複して合計されます。図の各顧客に当てはめると、次のようになります。
・A:条件を満たすのは4月中に開始した最新行の1行だけなので、正しい額になる。
・D:4月中に開始した1行だけなので、正しい額になる。
・F:開始が4/30より後で条件は満たすが、4月の預入はそもそもないため、0円で正しい。
・G:4月中に開始・終了した1行だけなので、正しい額になる。
・B:4月中に開始した行が2行あるため、預入額が2重に集計されて多くなる。
・E:4月中に開始した行が3行あるため、3重に集計されて多くなる。
・C、H:開始日が4/1より前なので、結果行がなく0円になる。
・I:終了日が4/30より後でNULLでもないので、結果行がなく0円になる。
公式解答例も、正しい=A、D、F、G、多くなる=B、E、少なくなるが0円ではない=該当なし(空欄)、0円=C、H、I としています。
学習のポイント
期間の検索条件は『開始日≦基準日の終わり かつ 終了日≧基準日の始まり(またはNULL)』で書くこと、自己結合で次の行と比べる方法、先日付の行を後から追加・分割するときの整合性の保ち方、結合によって行が重複し集計値が膨らむ仕組みを重点的に学習しましょう。
出典:独立行政法人 情報処理推進機構(IPA)平成21年度春期 データベーススペシャリスト試験 午後Ⅰ 問3(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針