Sql 替代输入(选择…)
我对SQL相当陌生,所以我正在做这个CS50习题集。我找到了一个解决方案,它使用了WHERE。。。在(SELECT…)子句中,但对我来说,它似乎相当缓慢和低效。有更好的方法吗 我的问题是: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
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
.......................