[SQL]1対多対1の関係のテーブルから、2条件でAND検索する方法

前提

現在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 コメント