내 SQL 스크립트가 너무 많은 출력을 선택하는 이유는 무엇입니까 (CS50 pset7 sql.13)?

Aug 19 2020

나는 현재 cs50에서 pset7을 작업 중이며 지정된 값의 올바른 수를 선택했다고 생각했지만 내 스크립트는 정답 키에있는 176 개 대신 349 개 행을 출력합니다.

"13.sql에서 Kevin Bacon이 출연 한 영화에 출연 한 모든 사람의 이름을 나열하는 SQL 쿼리를 작성합니다. 쿼리는 각 사람의 이름에 대한 단일 열이있는 테이블을 출력해야합니다. 여러 개가있을 수 있습니다. 데이터베이스에 Kevin Bacon이라는 이름의 사람들이 있습니다. 1958 년에 태어난 Kevin Bacon 만 선택해야합니다. Kevin Bacon 자신은 결과 목록에 포함되지 않아야합니다. "

CS50 pset7 sql.13

sqlite> .schema
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 directors (
                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 ratings (
                movie_id INTEGER NOT NULL,
                rating REAL NOT NULL,
                votes INTEGER NOT NULL,
                FOREIGN KEY(movie_id) REFERENCES movies(id)
            );
CREATE TABLE people (
                id INTEGER,
                name TEXT NOT NULL,
                birth NUMERIC,
                PRIMARY KEY(id)
            );

내 스크립트

SELECT DISTINCT name

FROM 
    people
    INNER JOIN  stars ON people.id = stars.person_id
    INNER JOIN movies ON movies.id = stars.movie_id

WHERE movies.title IN (

SELECT
    title
    
From
    movies
    INNER JOIN stars ON movies.id = stars.movie_id
    INNER JOIN people ON stars.person_id= people.id
    
WHERE 
    people.name = "Kevin Bacon"
    AND
    people.birth = "1958"
    )
    
EXCEPT SELECT name FROM people WHERE people.name = "Kevin Bacon"

이 스크립트에 몇 가지 논리적 오류가 있습니까? 내 논리는 다음과 같습니다.

  • Kevin Bacon이 출연 한 모든 영화 선택 (중첩 SELECT)
  • Kevin Bacon 자신을 제외하고 이러한 Kevin Bacon 영화에 등장하는 스타의 이름 (주 SELECT)을 선택합니다.

답변

Isolated Aug 19 2020 at 02:49

이와 같은 것은 postgres에서 작동합니다. 데이터베이스에 맞게 조정해야 할 수 있습니다.

    select name
    from (
        with kb_movies as
            (select distinct movies.id as kb_movie_id
            from movies
            join stars 
                on stars.movie_id = movies.id
            join people 
                on people.id = stars.people_id
            where people.name = 'Kevin Bacon'
            and people.birth = '1958' --or 1958
            )
            select distinct people.name
            from people
            join stars 
                on stars.people_id = people.id
            join movies 
                on movies.id = stars.movie_id
            join kb_movies 
                on kb_movie_id = movies.id
        )z
    where name <> 'Kevin Bacon'