関係データベースのOR条件で該当部署を正しく拾うには
ITパスポート試験 令和7年度 問66 / データベース › データ操作
過去問にチャレンジ
関係データベースで管理している次の「ログイン記録」表及び「部署」表において、ログイン結果が失敗となったことのある、又は、2022年4月10日09:00:00以前にログイン結果が成功となったことのある従業員が所属する部署名だけを全て挙げたものはどれか。


- ア
営業部,システム部
- イ
営業部,システム部,人事部
- ウ
営業部,人事部
- エ
システム部,人事部
会話形式の解説
講師今回は、2つの表を見比べて条件に合う部署名を選ぶ問題です。注目してほしいのは、条件が「又は」でつながっている点です。どちらか一方を満たせば対象になるOR条件だと押さえてから表を見ていきましょう。
受験者条件が2つあって、少し混乱しそうです。私は上から1行ずつ、両方の条件を同時に確かめようと思っていました。
講師その方法でも解けますが、見落としが起きやすくなります。OR条件は、条件ごとに当てはまる行を別々に洗い出して、最後に合わせて重複を除くほうが確実です。まず1つ目の「ログイン結果が失敗となったことがある」から見てみましょう。
受験者失敗の行は3つあります。08:50:42と09:39:22が部署番号003、10:00:02が001です。1つ目の条件には時刻がないので、10時台の失敗も数えてよいのですね。
講師そのとおりです。「失敗したことがある」には日時の指定がないので、失敗の行は時刻を問わず対象です。1つ目の条件で拾える部署番号は003と001ですね。次に、2つ目の「09:00:00以前に成功したことがある」はどうでしょう。
受験者09:00:00より前の成功は、08:53:15の003と、08:55:48の002です。09:00:15の001の成功は、9時を過ぎているので入りません。
講師正確です。09:00:15はわずかに9時を過ぎているので、2つ目の条件からは外れます。では、2つの条件の結果を合わせると部署番号はどうなりますか。
受験者003と001、それに003と002を合わせて重複を除くと、001・002・003の全部です。部署表で置き換えると、営業部・システム部・人事部になります。
講師それで3部署すべてを挙げた選択肢が正解になります。ほかの選択肢も確認しておきましょう。営業部とシステム部だけの組合せは人事部が抜けていますが、人事部は失敗もしていて、9時前の成功もあるので両方の条件を満たします。
受験者営業部と人事部だけの組合せは、システム部が抜けています。システム部には失敗の記録がありませんが、08:55:48に成功しているので2つ目の条件に当てはまります。
受験者システム部と人事部だけの組合せが少し気になります。営業部は9時前の成功がないので、外してしまいそうでした。
講師そこがこの問題でいちばん間違えやすいところです。営業部は2つ目の条件では外れますが、10:00:02に失敗しているので1つ目の条件を満たします。OR条件では、片方で外れても、もう片方で当てはまれば対象に残ります。
受験者条件ごとに分けて部署番号を書き出し、最後に合わせてから部署表で名前に置き換える、という順番で考えればよいのですね。
講師そのとおりです。補足すると、SQL(データベースを操作する言語)では、OR条件でログイン記録を絞り込み、部署表と結合(JOIN)してから、DISTINCTで重複を除くと同じ結果が得られます。部署名はログイン記録の部署番号を部署表と照らし合わせて求める、という表のつながり方も覚えておきましょう。
まとめ
この問題は、ログイン記録表と部署表から、「ログインに失敗したことがある」または「2022年4月10日09:00:00以前にログインに成功したことがある」従業員の部署名を求めるものです。失敗の記録がある部署番号は003と001、9時前に成功した記録がある部署番号は003と002です。これらを合わせて重複を除くと001・002・003になり、営業部・システム部・人事部の3部署すべてが当てはまります。営業部は9時前の成功がないので外しがちですが、10:00:02の失敗で1つ目の条件を満たします。OR条件は条件ごとに該当行を洗い出し、最後に合わせて重複を除くと間違えにくくなります。
解答・解説
正解はイです
この問題のテーマ
関係データベースの2つの表を使い、「失敗したことがある」または「指定時刻以前に成功したことがある」というOR条件で記録を絞り込み、部署表で部署名に置き換えられるかを問う問題です。
解き方の考え方
まず、条件が「又は」でつながったOR条件であることを確認し、2つの条件を別々に調べます。1つ目の条件では、ログイン結果が「失敗」の行を日時に関係なく探し、その部署番号を書き出します。2つ目の条件では、09:00:00以前で結果が「成功」の行を探し、その部署番号を書き出します。両方の部署番号を合わせて重複を除き、部署表で部署名に置き換えれば答えが決まります。
選択肢ごとの解説
- ×ア 営業部,システム部営業部とシステム部だけを挙げる組合せは、人事部(003)が抜けています。人事部は08:50:42と09:39:22に失敗しており、08:53:15には09:00:00より前に成功しているので、どちらの条件も満たします。
- ○イ 営業部,システム部,人事部失敗記録の部署番号は003と001で、09:00:00以前の成功記録の部署番号は003と002です。これを合わせると001・002・003の全部署になり、部署表では営業部・システム部・人事部にあたります。3部署を挙げたこの選択肢が正解です。
- ×ウ 営業部,人事部営業部と人事部だけを挙げる組合せは、システム部(002)が抜けています。システム部には失敗記録がありませんが、08:55:48に成功しており、2つ目の条件を満たします。
- ×エ システム部,人事部システム部と人事部だけを挙げる組合せは、営業部(001)が抜けています。営業部の成功記録はどれも09:00:00より後ですが、10:00:02に失敗しているので1つ目の条件を満たします。
補足
営業部の09:00:15の成功は09:00:00より後なので、2つ目の条件には当てはまりません。ここで営業部を外してしまうとエを選びがちですが、営業部は10:00:02の失敗によって1つ目の条件を満たします。SQLで書く場合は、OR条件でログイン記録を絞り込み、部署表と結合(JOIN)してからDISTINCTで重複を除くと、同じ結果を得られます。
POINT
- 「又は」はOR条件なので、どちらか一方の条件を満たせば対象になります。
- OR条件は条件ごとに該当行を洗い出し、最後に合わせて重複を除くと間違えにくくなります。
- 「失敗したことがある」には時刻の指定がないので、失敗の行は日時を問わず数えます。
- 部署名はログイン記録の部署番号を部署表と照合して求めます。
