2013-03-02 25 views
1

返回元素,這裏是我的數據SQL查詢,怎麼就不能在其他2臺

電影表:

id title 
10 Promise Land 
13 Alive 
14 Bruce Almighty 
15 Decay 
19 Malcom X 

用戶表:

id username 
1 Franck 
2 Matt 

檔案表:

userid movieid 
1  13 
2  14 
1  14 

我想獲得所有movies.id,電影.title僞不在存檔表的用戶ID = 1 我想使用連接(我不想選擇的選擇)

的結果應該是:

id title 
10 Promise Land 
15 Decay 
19 Malcom X 

下面的SQL失敗:

SELECT a.id,a.title 
FROM db.movies AS a 
LEFT JOIN db.archive AS b ON a.id = b.movieid 
LEFT JOIN db.users AS c ON c.id = b.userid 
WHERE b.movieid IS NULL OR b.userid !=1; 

感謝

回答

2

使用連接。你把用戶ID過濾器進入JOIN

SELECT 
    a.id,a.title 
FROM 
    binews.movies AS a 
    LEFT JOIN 
    binews.archive AS b ON a.id = b.movieid AND b.userid <> 1 
WHERE 
    b.movieid IS NULL; 

但是,你實際上是問:「給我的電影,他們不存在此用戶在歸檔表格)

SELECT 
    a.id,a.title 
FROM 
    binews.movies AS a 
WHERE 
    NOT EXISTS (SELECT * 
      FROM 
      binews.archive AS b 
      WHERE 
      a.id = b.movieid AND b.userid <> 1); 

這是比較正確的通常,在某些情況下,你會得到從左側多行JOIN其中一個用戶標識已使用超過一次同樣多。爲了解決這個問題,你需要DISTINCT它增加了處理。

但是,與移除此多行輸出。

更多的顯示方式:http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/

+0

b.userid對不對? – ssilas777 2013-03-02 09:46:43

+0

@ ssilas777:是的,謝謝。我在發帖後注意到 – gbn 2013-03-02 09:47:16

+0

不,這個查詢返回 10 Promise Land 13活着 15 Decay 19 Malcom X – Franck 2013-03-02 09:59:10

0
select * from binews.movies 
     where id not in(select movieid from binews.archive where userid<>1) 
+0

我寫道,我想避免多選。謝謝 – Franck 2013-03-02 10:01:51

0

感謝GBN。這裏是一個更正 「和b.userid = 1」

SELECT 
    a.id,a.title 
FROM 
    binews.movies AS a 
    LEFT JOIN 
    binews.archive AS b ON a.id = b.movieid AND b.userid=1 
WHERE 
b.movieid IS NULL 
1

在SQLServer2005的+,你可以使用選項與EXISTS和EXCEPT運營商

SELECT * 
FROM dbo.movies 
WHERE EXISTS (
       SELECT id 
       EXCEPT 
       SELECT movieid 
       FROM archive 
       WHERE userid = 1 
      ) 

演示上SQLFiddle

解決方案選項與NOT EXISTS和INTERSECT運營商

SELECT * 
FROM dbo.movies 
WHERE NOT EXISTS (       
        SELECT movieid 
        FROM archive 
        WHERE userid = 1 
        INTERSECT 
        SELECT id 
       ) 

演示SQLFiddle