0

表:电影

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 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

我需要获取尚未评分的电影。在这种情况下,泰坦尼克号 (mID 105) 和星球大战 (mID 102) 永远不会在评级表中获得评级。

我想通了

从电影中选择不同的movie.title,rating where rating.mid!=movie.mid 除了从电影中选择不同的movie.title,rating where rating.mid=movie.mid

但是我认为它可能有更好(更容易/更清洁)的方法。

4

4 回答 4

5

简单的:

SELECT Movies.* FROM Movies LEFT JOIN Rating ON Movies.mID = Rating.mID WHERE Rating.mID IS NULL
于 2013-08-22T13:30:47.073 回答
3

如果我正确理解了您的问题,那看起来就像教科书应用外连接

于 2013-08-22T13:27:42.670 回答
3

你可以这样做:

SELECT * FROM Movie WHERE mid NOT IN (SELECT DISTINCT(mid) FROM Rating)

基本上,它将从电影表中选择不在评级表中的所有记录,将它们链接到“中间”列,我假设这是一个唯一标识符。

于 2013-08-22T13:30:56.590 回答
3

我将添加另一种可能性。

Select [list columns here]
from Movie m
where NOT exists (SELECT * FROM RATING r where m.mid = r.mid)
于 2013-08-22T13:38:40.863 回答