เหตุใดสคริปต์ SQL ของฉันจึงเลือกเอาต์พุตมากเกินไป (CS50 pset7 sql.13)

Aug 19 2020

ฉันกำลังทำงานกับ pset7 ใน cs50 และฉันคิดว่าฉันได้เลือกจำนวนค่าที่ถูกต้องที่ระบุไว้ แต่สคริปต์ของฉันกำลังแสดงผล 349 แถวแทนที่จะเป็น 176 ที่คีย์คำตอบมี

"ใน 13.sql เขียนแบบสอบถาม SQL เพื่อแสดงรายชื่อของทุกคนที่แสดงในภาพยนตร์ที่ Kevin Bacon ร่วมแสดงด้วยแบบสอบถามของคุณควรแสดงผลตารางที่มีคอลัมน์เดียวสำหรับชื่อของแต่ละคนอาจมีหลาย ๆ คนที่ชื่อเควินเบคอนในฐานข้อมูลอย่าลืมเลือกเฉพาะเควินเบคอนที่เกิดในปี 2501 เควินเบคอนเองไม่ควรรวมอยู่ในรายชื่อผลลัพธ์ "

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"

มีข้อผิดพลาดทางตรรกะในสคริปต์นี้หรือไม่? ตรรกะของฉันคือ:

  • เลือกภาพยนตร์ทั้งหมดที่เควินเบคอนแสดงใน (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'