我目前正在通过这个https://cs50.harvard.edu/x/2020/psets/7/movies/ 并尝试完成 9.sql。
有一个名为“电影”的数据库,其中包含表:电影(列:id、标题、年份)、人物(id、姓名、出生)和明星(movie_id、person_id)。
任务是:
编写一个 SQL 查询来列出所有出演 2004 年上映的电影的人的名字,按出生年份排序。它应该返回 18,013 个名字。
到目前为止,这就是我所做的:
SELECT count(distinct name)
from people
join stars on stars.person_id = people.id
join movies on stars.movie_id = movies.id
WHERE year = 2004;
Run Code Online (Sandbox Code Playgroud)
但是,这仅返回 17,965 的计数......
谁能看出为什么会这样?
如果你count(distinct person_id),那么你将得到 18013。名称不唯一是合理的。不合理的是考试中的指令说你应该只列出姓名。
正确区分名称的一种方法是执行以下操作:
SELECT p.name
from people p
where p.id in (
select distinct s.person_id
from stars s join movies m on s.movie_id = m.id
WHERE m.year = 2004)
Run Code Online (Sandbox Code Playgroud)
如果你这样做,那么你甚至不需要distinct由于in运算符的定义。但无论如何,您可能会得到相同的执行计划。
在我看来,p.name如果它属于另一个人,可以列出不止一次。如果规则以这些词开头,您编写的查询就可以了:
如果一个人的名字...
而不是这些词:
如果一个人...
这让我想起了CJ Date有一天在课堂上做的一件事。他在他的投影仪上放了一张箔片,在墙上投射出一张烟斗的图像。他接着问:这是什么?
既然是数据库课,不是物理课,谁也不敢当smart-a**。