ITパスポート 2025年 問66
問題文
関係データベースで管理している次の“ログイン記録”表及び“部署”表において、ログイン結果が失敗となったことのある、又は、2022年4月10日09:00:00以前にログイン結果が成功となったことのある従業員が所属する部署名だけを全て挙げたものはどれか。

選択肢
ア:営業部、システム部
イ:営業部、システム部、人事部(正解)
ウ:営業部、人事部
エ:システム部、人事部
🔒 解説は解答すると表示されます
ログイン記録表と部署表から条件を満たす部署名を求める問題【ITパスポート 解説】
正解の理由
この問題は「ある従業員が次のどちらかを満たすとき、その従業員が所属する部署名をすべて列挙する」ものです。
条件は「(A) ログイン結果が失敗となったことがある」または「(B) 2022年4月10日09:00:00以前にログイン結果が成功となったことがある」です。つまり A または B を満たす従業員の所属部署を拾えばよいです。
与えられた記録を確認すると、
- 部署番号002(システム部)は従業員10002が2022-04-10 08:55:48に成功しているので条件 B を満たします → システム部。
- 部署番号003(人事部)は従業員10004(08:50:42に失敗)や10005(09:39:22に失敗)がいるので条件 A を満たします → 人事部。
- 部署番号001(営業部)は従業員10011が10:00:02に失敗しているため条件 A を満たします → 営業部。
以上より、すべての該当部署は「営業部、システム部、人事部」です。したがって選択肢の中では イ が正しいです。
解法ステップ
- 問題文の条件を「OR(いずれか)」で読む(ANDではない)。
- ログイン記録表を従業員ごとに見て、次のどちらかを満たす従業員を探す。
- ログイン結果が「失敗」となった行が1件でもある。
- 日時が "2022-04-10 09:00:00" 以下(以前)で、ログイン結果が「成功」となった行が1件でもある。 ※「以前」は指定時刻を含みます(09:00:00 を含む)。
- その従業員が含まれる「部署番号」を集める(同じ部署は1回だけでよい)。
- 部署表と照合して部署名に変換する。
実務的には SQL(Structured Query Language:データベースに問い合わせる言語)で次のように書けます(イメージ):
SELECT DISTINCT b.部署名
FROM 部署 b
JOIN (
SELECT 部署番号
FROM ログイン記録
WHERE ログイン結果 = '失敗'
OR (ログイン結果 = '成功' AND 日時 <= '2022-04-10 09:00:00')
) t ON b.部署番号 = t.部署番号;
- SELECT DISTINCT:重複を除いて1回だけ取る。
- JOIN:部署表とログイン結果の抽出結果を結びつける。
選択肢別の誤答解説
- ア(営業部、システム部)
→ 人事部(003)を見落としています。人事部には失敗記録(10004の08:50:42、10005の09:39:22)があるため除外できません。 - ウ(営業部、人事部)
→ システム部(002)を見落としています。10002が08:55:48に成功しており、これは「09:00:00以前の成功」に該当します。 - エ(システム部、人事部)
→ 営業部(001)を見落としています。10011が10:00:02に失敗しており、「失敗となったことがある」条件に該当します。
よくある誤解
- 条件を「両方満たす(AND)」だと誤解する
→ 問題文は「失敗となったことのある、又は、~以前に成功したことのある」と書かれており、どちらか一方でよい(OR)。 - 「以前」を「厳密に前」(<)と解釈して09:00:00を除外する
→ 一般に「以前」は指定時刻を含みます(<=)。問題文の「09:00:00以前」は 09:00:00 を含みます。 - 従業員の最新の記録だけを見る
→ 条件は「これまでに(過去に)~したことがある」なので、任意の時点の記録を調べる必要があります。最新だけだと見落とします。
補足コラム
- 関係データベース(リレーショナルデータベース):表(テーブル)同士の関連(キー)でデータを管理する仕組みです。今回は「ログイン記録」表と「部署」表を部署番号で結びつけます。
- DISTINCT(ディスティンクト):同じ部署名が何度も出るのを1つにまとめる命令です。
- EXISTS(エグジスツ)を使う方法:従業員単位で「失敗が存在するか」や「指定時刻以前の成功が存在するか」をチェックして部署を抽出する書き方もあります。
例(従業員単位に EXISTS を使うイメージ):
SELECT DISTINCT b.部署名
FROM 部署 b
WHERE EXISTS (
SELECT 1 FROM ログイン記録 l
WHERE l.部署番号 = b.部署番号
AND l.ログイン結果 = '失敗'
)
OR EXISTS (
SELECT 1 FROM ログイン記録 l
WHERE l.部署番号 = b.部署番号
AND l.ログイン結果 = '成功'
AND l.日時 <= '2022-04-10 09:00:00'
);
身近な例え:お店(部署)ごとに「クレジットカードが使えなかった記録が1回でもある店」か「指定日時より前に売上があった店」を探すような感覚です。
FAQ
Q1. 「失敗となったことがある」は日時の条件が不要ですか?
A1. はい。日時の条件は付いていません。いつ失敗してもよく、1回でも失敗記録があれば該当になります。
A1. はい。日時の条件は付いていません。いつ失敗してもよく、1回でも失敗記録があれば該当になります。
Q2. 同じ従業員が部署を変えていたらどう扱う?
A2. ログには各行に部署番号があるため、その行ごとに部署が判断されます。問題文の仕様ではログイン記録に記された部署番号で判断します(部署移動を別に集計する設問でない限り、ログの部署番号に従います)。
A2. ログには各行に部署番号があるため、その行ごとに部署が判断されます。問題文の仕様ではログイン記録に記された部署番号で判断します(部署移動を別に集計する設問でない限り、ログの部署番号に従います)。
Q3. 「09:00:00以前に成功」は09:00:00を含みますか?
A3. 含みます。一般的に「以前」はその時刻を含む解釈(<=)が標準です。問題の解釈で迷ったら、問題文の日本語をよく確認してください。
A3. 含みます。一般的に「以前」はその時刻を含む解釈(<=)が標準です。問題の解釈で迷ったら、問題文の日本語をよく確認してください。
関連キーワード: SQL、SELECT、JOIN、DISTINCT、EXISTS、タイムスタンプ、ログ解析、部署抽出、条件検索

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

