这是数据集:
Movie
(mID, title, year, director
)
英语:有一部ID号为mID
的电影,一个标题,一个发行年份和一个导演。
Reviewer
(rID, name
)
英语:ID号为rID
的评论者有一定的名称。
Rating
(rID, 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
我不确定我的加入有什么问题?提前谢谢!
答案 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 )