我正在从SQL Movie-Rating Query Exercises Extras中进行第4季度(查找未由Chris Jackson复审的所有电影的标题。),我不知道为什么此代码不起作用:
SELECT DISTINCT movie.title
FROM movie
INNER JOIN rating ON movie.mid = rating.mID
INNER JOIN reviewer ON rating.rid = reviewer.rid
WHERE rating.mid NOT IN (SELECT rating.mid FROM rating WHERE rating.rid = (SELECT reviewer.rid FROM reviewer WHERE reviewer.name = 'Chris Jackson') )
输出:
title
Gone with the Wind
Snow White
Avatar
此输出不包括电影表中的电影,但不包括在评级表中的电影。因此,我怀疑这可能与JOIN子句有关。
表格:
电影
mID title year director
101 Gone with the Wind 1939 Victor Fleming
102 Star Wars 1977 George Lucas
103 The Sound of Music 1965 Robert Wise
104 E.T. 1982 Steven Spielberg
105 Titanic 1997 James Cameron
106 Snow White 1937 <null>
107 Avatar 2009 James Cameron
108 Raiders of the Lost Ark 1981 Steven Spielberg
审阅者
rID name
201 Sarah Martinez
202 Daniel Lewis
203 Brittany Harris
204 Mike Anderson
205 Chris Jackson
206 Elizabeth Thomas
207 James Cameron
208 Ashley White
评分
rID mID stars ratingDate
201 101 2 2011-01-22
201 101 4 2011-01-27
202 106 4 <null>
203 103 2 2011-01-20
203 108 4 2011-01-12
203 108 2 2011-01-30
204 101 3 2011-01-09
205 103 3 2011-01-27
205 104 2 2011-01-22
205 108 4 <null>
206 107 3 2011-01-15
206 106 5 2011-01-19
207 107 5 2011-01-20
208 104 3 2011-01-02
答案 0 :(得分:1)
首先必须使用LEFT JOIN
,然后使用GROUP BY movie.mid, movie.title
并将条件放在HAVING
子句中:
SELECT movie.title
FROM movie
LEFT JOIN rating ON movie.mid = rating.mID
LEFT JOIN reviewer ON rating.rid = reviewer.rid
GROUP BY movie.mid, movie.title
HAVING SUM(CASE WHEN reviewer.name = 'Chris Jackson' THEN 1 ELSE 0 END) = 0
请参见demo。
结果:
> | title |
> | :----------------- |
> | Avatar |
> | Gone with the Wind |
> | Snow White |
> | Star Wars |
> | Titanic |
答案 1 :(得分:0)
尽管您可以使用聚合,但我建议为此使用NOT EXISTS
。它接近您想要的逻辑措辞:
SELECT m.*
FROM movie m
WHERE NOT EXISTS (SELECT 1
FROM rating r JOIN
reviewer re
ON r.rid = re.rid
WHERE m.mid = r.mID AND
re.name = 'Chris Jackson'
);
从性能的角度来看,应该根本没有可比性。这应该有更好的性能。