Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 替代输入(选择…)_Sql_Postgresql - Fatal编程技术网

Sql 替代输入(选择…)

Sql 替代输入(选择…),sql,postgresql,Sql,Postgresql,我对SQL相当陌生,所以我正在做这个CS50习题集。我找到了一个解决方案,它使用了WHERE。。。在(SELECT…)子句中,但对我来说,它似乎相当缓慢和低效。有更好的方法吗 我的问题是: SELECT name from "people" INNER JOIN "stars" ON people.id = stars.person_id WHERE stars.movie_id IN( SELECT movie_id from "s

我对SQL相当陌生,所以我正在做这个CS50习题集。我找到了一个解决方案,它使用了WHERE。。。在(SELECT…)子句中,但对我来说,它似乎相当缓慢和低效。有更好的方法吗

我的问题是:

SELECT name from "people"
INNER JOIN "stars" ON people.id = stars.person_id
WHERE
  stars.movie_id IN(
    SELECT movie_id from "stars"
    INNER JOIN "people" ON stars.person_id = people.id
    WHERE people.name = "Kevin Bacon" and people.birth = 1958
  )
EXCEPT
  SELECT name from "people"
  WHERE name = "Kevin Bacon" and birth = 1958;
目标是找回所有与凯文·培根主演的演员(培根本人除外)

数据库看起来像这样

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

您可以使用联接来完成此操作。
加入2份
人物
和2份
明星

每个表的第一个副本将用于返回结果中所需演员的姓名,每个表的第二个副本将用于返回带有
'Kevin Bacon'
的所有电影:

SELECT p1.name 
from people p1
INNER JOIN stars s1 ON s1.person_id = p1.id
INNER JOIN stars s2 ON s2.movie_id = s1.movie_id
INNER JOIN people p2 ON p2.id = s2.person_id AND p2.id <> p1.id
WHERE p2.name = 'Kevin Bacon' AND p2.birth = 1958 

除此之外,不需要其他的。你可以在WHERE子句中过滤掉Kevin Bacon,MySql中没有例外。标记您使用的数据库。这不是进行此查询的最有效方式,但我建议使用递归CTE,因为CTE会让您回答“Kevin Bacon有多少度?”@jarlh谢谢,但我的问题更多的是关于in(select)部分。我把except子句放在这里是为了使它明确无误。
SELECT DISTINCT p1.name 
.......................