-1

这是数据集:

电影(mID,片名,年份,导演) 英文:有一部电影,ID号为mID,片名,上映年份,导演。

Reviewer (rID, name) 英文:ID号为rID的reviewer有一定的名字。

Rating (rID, mID, stars, ratingDate) 英文:评论者 rID 给电影 mID 在某个 ratingDate 上的星级评分 (1-5)。

问题是:找出所有没有评分的电影的标题。

我的回答:(返回一个空集)

select title from movie,rating where movie.mid=rating.mid and stars is null

正确答案:

 select title
 from movie 
 left join rating using (mID)
 where stars is null

我不确定我的加入有什么问题?提前致谢!

4

2 回答 2

1

您在电影和评级之间进行完全交叉连接。这意味着您的结果集最初包含所有可能的(电影、评级)组合。

你需要movie.mid = rating.mid. 这会将您的结果集限制为只有那些(电影,评级)对,其中评级实际上是与其配对的电影。

但是想象一下没有评级的电影。它永远不会出现在评级表中,因此movie.mid = rating.mid也永远不会是真的。由于这绝不是真的,所有没有评分的电影都将从 where 子句的结果集中删除。

正确答案使用left join. 连接将电影中的所有行与通过连接条件的评级中的所有行匹配(在这种情况下mID需要相等)。到目前为止,这在语义上与您编写的内容相同。但随后left部分开始发挥作用:这意味着对于任何在评级中没有任何行通过连接条件的电影行,无论如何(一次)包含电影行NULL以及评级表列的所有值。然后,该stars is null条件仅采用left效果生成的行。(请注意,where 子句只有stars在评级表中不允许为空时才能正常工作。)

于 2013-08-12T00:14:48.830 回答
0

如果一部电影没有评分,rating.mid则为空,因此movie.mid=rating.mid为假。

如果一部电影确实有评分,那么它movie.mid=rating.mid会起作用,但(大概)stars is null会是错误的。

所以你的条件永远不会满足。

您发布的正确答案有效,因为条件与join条件是分开的where。首先将movies表连接到rating表,然后将结果过滤到没有任何连接的行。

于 2013-08-12T00:09:27.870 回答