我如何选择不出现在另一个表中的记录

时间:2013-08-22 13:24:43

标签: sql sqlite

表:电影

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.mid!= movie.mid除了从中选择distinct movie.title   电影,评级为rating.mid = movie.mid

然而,我认为它可能有更好(更容易/更清洁)的方式。

4 个答案:

答案 0 :(得分:5)

简单:

SELECT Movies.* FROM Movies LEFT JOIN Rating ON Movies.mID = Rating.mID WHERE Rating.mID IS NULL

答案 1 :(得分:3)

如果我理解你的问题,那就像是outer joins的教科书应用。

答案 2 :(得分:3)

你可以这样做:

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

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

答案 3 :(得分:3)

我将增加另一种可能性。

Select [list columns here]
from Movie m
where NOT exists (SELECT * FROM RATING r where m.mid = r.mid)