为什么我的查询返回空结果?

时间:2013-08-03 05:25:03

标签: sql

这是数据集:

  • MoviemID, title, year, director
    英语:有一部ID号为mID的电影,一个标题,一个发行年份和一个导演。

  • ReviewerrID, name
    英语:ID号为rID的评论者有一定的名称。

  • RatingrID, mID, stars, ratingDate
    简体中文:评论者rID在某个mID上为电影ratingDate提供了一些评分(1-5)的星标。

这是一个问题:找到所有没有收视率的电影的标题。

我的回答:(返回空集)

 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

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

2 个答案:

答案 0 :(得分:1)

您的查询会查找所做的每条movie记录都有相应的rating记录 - 这就是movie JOIN rating的含义 - 前提是{{1} }记录有rating

正确的查询会查找每个{em> 缺少stars IS NULL记录movie记录rating记录{1}}。

关键区别在于,作为第一步,您的查询将过滤掉任何rating条记录而不匹配stars IS NULL条记录(因为这些记录会使连接失败),而正确的查询会使用{ {1}}以防止此过滤。

(请注意,即使使用movie,如果rating子句的构建效果不佳,也可能会发生此过滤。例如,LEFT JOIN也会过滤掉LEFT JOIN记录没有相应的WHERE记录,因为只有现有的WHERE stars = 'X'记录可以满足movie - 条款。但是rating,这个问题不会出现,因为{{1} }}是连接失败时的默认值rating。)

答案 1 :(得分: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 )