Mengapa skrip SQL saya memilih terlalu banyak keluaran (CS50 pset7 sql.13)?

Aug 19 2020

Saat ini saya mengerjakan pset7 di cs50, dan saya pikir saya telah memilih jumlah nilai yang ditentukan dengan benar, tetapi skrip saya mengeluarkan 349 baris alih-alih 176 yang dimiliki kunci jawaban.

"Di 13.sql, tulis kueri SQL untuk mencantumkan nama semua orang yang membintangi film yang juga dibintangi Kevin Bacon. Kueri Anda harus menampilkan tabel dengan kolom tunggal untuk nama setiap orang. Mungkin ada beberapa orang bernama Kevin Bacon di database. Pastikan hanya memilih Kevin Bacon yang lahir pada tahun 1958. Kevin Bacon sendiri tidak boleh disertakan dalam daftar hasil. "

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

SKRIP SAYA

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"

Apakah ada kesalahan logika dalam skrip ini? Logika saya adalah:

  • Pilih semua film yang dibintangi Kevin Bacon (SELECT bersarang)
  • Pilih nama bintang (PILIHAN utama) yang muncul di salah satu film Kevin Bacon ini, kecuali Kevin Bacon sendiri.

Jawaban

Isolated Aug 19 2020 at 02:49

Sesuatu seperti ini akan bekerja di postgres. Mungkin perlu beradaptasi dengan database Anda.

    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'