平成28年度 秋期 応用情報技術者試験 午前 問29
テクノロジ/データベース"サッカーチーム"表と"審判"表から,条件を満たす対戦を導出する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 ]
出典:平成28年度 秋期 応用情報技術者試験 午前 問29
- ア(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.所属チーム名)
正解:イ
解説
このSQL文は,サッカーチームA,サッカーチームB,審判Cの直積からA.チーム名<B.チーム名を満たす組合せを取り出しており,Cは各出力行における特定の審判候補を表します。条件aには,その審判Cの所属チームが対戦する両チーム(A,B)のいずれとも一致しないことを直接指定すればよいので,C.所属チーム名 NOT IN (A.チーム名, B.チーム名) が適切です。
選択肢ごとの解説
- ア誤り。A.チーム名とB.チーム名は互いに異なるチームであり,審判Cは同時に両方のチームに所属することはできないため,「A.チーム名<>C.所属チーム名 OR B.チーム名<>C.所属チーム名」は常に真になってしまい,実質的に何も絞り込めません。
- イ正しい。C.所属チーム名がA.チーム名ともB.チーム名とも異なることをNOT INで直接指定することで,対戦する両チームのいずれにも所属しない審判の行だけが残ります。
- ウ誤り。このEXISTS文はCとは無関係な審判Dが別に存在するかどうかを判定しているだけで,現在の行のCがその条件を満たす審判であるかどうかを直接は検証していないため,本来除外すべき組合せが残ってしまいます。
- エ誤り。このNOT EXISTS文は「所属チームがA又はBと一致する審判が一人もいない」ことを要求しますが,A・Bそれぞれに所属する審判は表に必ず存在するため,この条件はほぼ常に偽となり,必要な行まで除外してしまいます。