平成27年度 春期 午前Ⅱ 問11
データ操作
相関副問合せに関する問題
庭に訪れた野鳥の数を記録する“観測”表がある。観測のたびに通番を振り,鳥名と観測数を記録している。AVG関数を用いて鳥名別に野鳥の観測数の平均値を得るために,一度でも訪れた野鳥については,観測されなかったときの観測数を0とするデータを明示的に挿入する。SQL文のaに入る字句はどれか。ここで,通番は初回を1として,観測のタイミングごとにカウントアップされる。
CREATE TABLE 観測 (
通番 INTEGER,
鳥名 CHAR(20),
観測数 INTEGER,
PRIMARY KEY (通番, 鳥名))
INSERT INTO 観測
SELECT DISTINCT obs1.通番, obs2.鳥名, 0
FROM 観測 AS obs1, 観測 AS obs2
WHERE NOT EXISTS (
SELECT * FROM 観測 AS obs3
WHERE [ a ]
AND obs2.鳥名= obs3.鳥名)- アobs1.通番 = obs1.通番
- イobs1.通番 = obs2.通番
- ウobs1.通番 = obs3.通番
- エobs2.通番 = obs3.通番
答えと解説を見る
✓ これが正解ウobs1.通番 = obs3.通番
解説
通番と鳥名の組がまだ記録にないことを、obs3で確かめます。
このINSERT文は、obs1から通番を、obs2から鳥名を取り出してすべての組合せを作り、その組のうち観測表にまだ行がないものについて、観測数0の行を挿入します。まだ行がないことを確かめるのがNOT EXISTSの副問合せで、obs3の中に、通番がobs1の通番と等しく、鳥名がobs2の鳥名と等しい行があるかを調べます。鳥名の条件はすでに書かれているので、空欄にはobs1.通番 = obs3.通番が入ります。こうすると、ある通番の観測でその鳥がいなかった組だけが選ばれ、0の行が補われます。外側の二つの表から作る組を、内側の表で一つずつ照合する形として読むと、相関副問合せの条件が組み立てやすくなります。
ほかの選択肢はなぜ違うのか
- アobs1.通番 = obs1.通番:obs1.通番 = obs1.通番は常に成り立つので、副問合せは鳥名が一致する行があるかだけを調べます。obs2の鳥はobs3にも必ず見つかるため、NOT EXISTSはいつも偽になり、1行も挿入されません。
- イobs1.通番 = obs2.通番:副問合せの条件が外側の二つの表どうしの比較になり、obs3の通番を見ていません。通番が異なる組ではどの行も条件を満たさないので、すでに記録がある組まで0の行として挿入しようとします。
- エobs2.通番 = obs3.通番:obs2の通番と鳥名でobs3を探すと、obs2の行そのものが必ず見つかります。そのためNOT EXISTSはいつも偽になり、観測されなかった組を見つけられず、0の行は挿入されません。
出典:平成27年度 春期 データベーススペシャリスト試験 午前Ⅱ 問11
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)