2013-08-22 44 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) 
相關問題