条件を満たす対戦を求める SQL
出典: 平成28年度 秋期 応用情報技術者試験 午前 問29 (IPA)
“サッカーチーム”表と“審判”表から,条件を満たす対戦を導出する SQL 文の a に入れる字句はどれか。
〔条件〕
・出場チーム 1 のチーム名は出場チーム 2 のチーム名よりもアルファベット順で先にくる。
・審判は,所属チームの対戦を担当することはできない。
サッカーチーム
| チーム名 |
|---|
| X |
| Y |
| Z |
審判
| 氏名 | 所属チーム名 |
|---|---|
| 佐藤健太 | X |
| 鈴木翔太 | Y |
| 髙橋拓也 | Z |
対戦
| 出場チーム 1 | 出場チーム 2 | 審判氏名 |
|---|---|---|
| X | Y | 髙橋拓也 |
| X | Z | 鈴木翔太 |
| Y | Z | 佐藤健太 |
〔SQL 文〕
SELECT A.チーム名 AS 出場チーム 1, B.チーム名 AS 出場チーム 2,
C.氏名 AS 審判氏名
FROM サッカーチーム AS A, サッカーチーム AS B, 審判 AS C
WHERE A.チーム名 < B.チーム名 AND [ a ]- ア (A.チーム名 <> C.所属チーム名 OR B.チーム名 <> C.所属チーム名)
- イ C.所属チーム名 NOT IN (A.チーム名, B.チーム名)
- ウ EXISTS (SELECT * FROM 審判 AS D WHERE A.チーム名 <> D.所属チーム名 AND B.チーム名 <> D.所属チーム名)
- エ NOT EXISTS (SELECT * FROM 審判 AS D WHERE A.チーム名 = D.所属チーム名 OR B.チーム名 = D.所属チーム名)
正解と解説を見る
正解: イ
- ア: OR だと、片方のチームに所属していなければ条件を満たしてしまいます。例えば X 対 Y を X 所属の佐藤さんが担当できてしまいます。
- イ: 審判の所属チームが 2 チームのどちらでもないことを NOT IN で表しているので正しい答えです。
- ウ: 副問合せは審判 D について調べていて、C との対応がありません。条件を満たす審判が 1 人でもいれば全ての C が選ばれてしまいます。
- エ: 副問合せは C と関係がなく、出場チームに所属する審判は必ずいるので、NOT EXISTS は常に偽になり 1 行も選ばれません。
ポイント
- 審判 C は、出場する 2 チーム (A と B) の どちらにも所属していない 必要があります。
- 「C.所属チーム名 が A.チーム名 と B.チーム名 の どちらでもない」は、C.所属チーム名 NOT IN (A.チーム名, B.チーム名) と書けます。