Perché il mio script SQL seleziona troppi output (CS50 pset7 sql.13)?

Aug 19 2020

Attualmente sto lavorando su pset7 in cs50 e pensavo di aver selezionato il numero corretto di valori specificati, ma il mio script emette 349 righe invece delle 176 della chiave di risposta.

"In 13.sql, scrivi una query SQL per elencare i nomi di tutte le persone che hanno recitato in un film in cui ha recitato anche Kevin Bacon. La tua query dovrebbe restituire una tabella con una singola colonna per il nome di ogni persona. Potrebbero esserci più persone chiamate Kevin Bacon nel database. Assicurati di selezionare solo Kevin Bacon nato nel 1958. Lo stesso Kevin Bacon non dovrebbe essere incluso nell'elenco risultante."

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)
            );

LA MIA SCRITTURA

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"

Ci sono degli errori logici in questo script? La mia logica era:

  • Seleziona tutti i film in cui recita Kevin Bacon (SELECT annidato)
  • Seleziona i nomi delle star (SELEZIONE principale) che appaiono in uno qualsiasi di questi film di Kevin Bacon, ad eccezione dello stesso Kevin Bacon.

Risposte

Isolated Aug 19 2020 at 02:49

Qualcosa del genere funzionerebbe in postgres. Potrebbe essere necessario adattarsi al database.

    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'