0

这是数据集:

  • Movie( mID, title, year, director)
    英文:有一部电影,有ID号mID、片名、上映年份和导演。

  • Reviewer( rID, name)
    英文:ID号的审稿rID人有一定的姓名。

  • Rating( rID, mID, stars, ratingDate)
    英语: 评论家rID给这部电影mID打了几颗星(1-5)ratingDate

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

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

 select m.title
 from movie m 
 join rating r on m.mid = r.mid
 where stars is null

正确答案:

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

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

4

2 回答 2

1

您的查询会找到确实具有相应记录的每条movie记录——这就是 的含义——前提是所述记录具有.ratingmovie JOIN ratingratingstars IS NULL

正确的查询会找到缺少记录有记录movie每条记录。ratingratingstars IS NULL

关键区别在于,作为第一步,您的查询将过滤掉任何movie没有匹配rating记录的记录(因为这些记录会使连接失败),而正确的查询使用 aLEFT JOIN来防止这种过滤。

(请注意,即使使用 a LEFT JOIN,如果WHERE子句构造不佳,仍然会发生此过滤。例如,WHERE stars = 'X'也会过滤掉movie没有相应rating记录的记录,因为只有存在的rating记录才能满足-WHERE子句。但是使用WHERE stars IS NULL,这个问题不出现,因为是连接失败时NULL的默认值。)stars

于 2013-08-03T05:30:25.387 回答
1

您可以使用此查询,其中标题没有星号,
"select title from movie left join rating on rating.mid = movie.mid where rating.rid is null"
或者您可以使用

select title from movie where mid not in (select distinct mid from rating )
于 2013-08-03T05:31:52.087 回答