¿Por qué mi secuencia de comandos SQL selecciona demasiadas salidas (CS50 pset7 sql.13)?

Aug 19 2020

Actualmente estoy trabajando en pset7 en cs50, y pensé que había seleccionado la cantidad correcta de valores especificados, pero mi secuencia de comandos genera 349 filas en lugar de las 176 que tiene la clave de respuesta.

"En 13.sql, escriba una consulta SQL para enumerar los nombres de todas las personas que protagonizaron una película en la que también protagonizó Kevin Bacon. Su consulta debe generar una tabla con una sola columna para el nombre de cada persona. Puede haber varias personas llamadas Kevin Bacon en la base de datos. Asegúrese de seleccionar solo al Kevin Bacon nacido en 1958. El propio Kevin Bacon no debe incluirse en la lista resultante".

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

MI GUIÓN

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"

¿Hay algunos errores lógicos en este script? Mi lógica era:

  • Seleccione todas las películas que protagoniza Kevin Bacon (SELECCIÓN anidada)
  • Seleccione los nombres de las estrellas (SELECCIÓN principal) que aparecen en cualquiera de estas películas de Kevin Bacon, excepto el propio Kevin Bacon.

Respuestas

Isolated Aug 19 2020 at 02:49

Algo como esto funcionaría en postgres. Es posible que deba adaptarse a su base de datos.

    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'