前提
現在cs50という授業で、SQLの勉強をしています。
課題の一つがわからず、ネット上の解答を見て解決はしたものの、なぜ解決したのかが理解できなかったため質問いたします。
実現したいこと
映画に関する以下の形式のDBから、Johnny DeppとHelena Bonham Carterが共演した作品のmovies.idを検索する。
CREATE TABLE movies ( id INTEGER, title TEXT NOT NULL, year NUMERIC, PRIMARY KEY(id) ); CREATE TABLE stars ( movie_id INTEGER NOT NULL, person_id INTEGER NOT NULL, FOREIGN KEY(movie_id) REFERENCES movies(id), FOREIGN KEY(person_id) REFERENCES people(id) ); CREATE TABLE people ( id INTEGER, name TEXT NOT NULL, birth NUMERIC, PRIMARY KEY(id) );
発生している問題・エラーメッセージ
検索結果が0件になる
該当のソースコード
SQL
SELECT movies.id, title FROM movies JOIN stars ON movies.id = stars.movie_id JOIN people ON stars.person_id = people.id WHERE people.name = "Johnny Depp" AND movies.id IN (SELECT movies.id FROM movies WHERE name = "Helena Bonham Carter");
試したこと
- 以下のコード(サブクエリ内で再度JOINを行ったもの)では目的の検索結果が得られた。
SQL
SELECT movies.id, title FROM movies JOIN stars ON movies.id = stars.movie_id JOIN people ON stars.person_id = people.id WHERE people.name = "Johnny Depp" AND movies.id IN (SELECT movies.id FROM movies JOIN stars ON movies.id = stars.movie_id JOIN people ON stars.person_id = people.id WHERE name = "Helena Bonham Carter");
- 私のコードでも、ANDで繋いだいずれかの条件のみで検索すれば(= 一人ずつ検索すれば)、正しい答えが返ってくることは確認済み
- そもそも一つのmovies.idに対応するレコードは複数存在する(一つの映画には複数人出演しているため)が、私の検索方法では一つのmovies.idに対しレコードは一つしか返ってこなかった。従って私のコードのAND以下の検索では、movies.idの数字だけでなくそのレコード自体を抽出しているため、二つの条件の積集合が存在しないと考えた。しかしそれが上記のコードにより解決する理屈がわからない。
0 コメント