2013-08-22 25 views
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.mid!=,除了选择不同movie.title movie.mid从 电影,评级,其中rating.mid = movie.mid

但是我想可能有更好(更容易/清洁剂)的方式来做。

+3

提示:'... LEFT JOIN ... WHERE IS RATINGDATE NULL' – MicSim

+0

@HLGEM不同意 - 隐式连接是不是一个反模式,它们仅仅是不是SQL ANSI标准,其中明确定义了JOIN语法的一部分。鉴于自Codd以来隐式连接已经存在,在ANSI标准之前有相当大的空间,并且在性能路径上与显式连接完全没有区别,这只是一种风格偏好。 –

+0

不,这不是一种文体上的偏好。隐含连接导致问题。如果您使用内部联合和外部联接的组合,您可以创建意外的corss联接,您可能会得到不好的结果,并且tey更难以维护。这是一个记录的反模式。使用它们和许多缺点没有好处。也许你应该阅读:http://www.amazon.com/SQL-Antipatterns-Programming-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s = digital-text&ie = UTF8&qid = 1377180059&sr = 1-1&keywords = sql +反模式 – HLGEM

回答

5

简单:

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

如果我正确理解你的问题,那看起来像教科书应用outer joins

3

你可以做这样的:

SELECT * FROM电影WHERE中旬NOT IN(SELECT DISTINCT(MID)的评级从)

基本上就会选择所有来自电影表的不在评分表中的记录,将它们链接到'中'栏,我假设它是一个唯一的标识符。

3

我会增加另一种可能性。

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