2011-08-09 178 views
1

我有兩個表的曲目列表和歌曲。我從sid獲取所有sid值作爲主參數,並將sid作爲外部參數。儘管使用此查詢從歌曲中提取所有值是成功的。問題與連接查詢

SELECT t.sid as tsid, s.sid as ssid, s.name from song s LEFT JOIN tracklist t ON s.sid=t.sid; 

但是,如果我希望從歌曲中獲取那些不在曲目列表中的值,則此查詢不會獲取單行。

SELECT t.sid as tsid, s.sid as ssid, s.name from song s LEFT JOIN tracklist t ON s.sid=t.sid where t.sid= NULL; 
+0

您是否嘗試過使用'JOIN'或'INNER JOIN',而不是一個'LEFT JOIN'? – JMichelB

+0

我不知道爲什麼你的第二個查詢失敗(對我來說看起來沒問題),但我會爲第一個查詢使用內部連接。 –

+1

@JMichel否使用左連接來查找不在表中的行是合法的。甚至mysql文檔[提及它](http://dev.mysql.com/doc/refman/5.0/en/left-join-optimization.html):「如果您使用LEFT JOIN查找不存在的行某些表...「 –

回答

3

不是=NULL,使用IS NULL

SELECT t.sid as tsid, s.sid as ssid, s.name from song s LEFT JOIN tracklist t ON s.sid=t.sid where t.sid IS NULL; 
2

我想你想使用IS NULL= NULL

e.g:

SELECT t.sid as tsid, s.sid as ssid, s.name 
FROM song s 
LEFT JOIN tracklist t ON s.sid=t.sid 
WHERE t.sid IS NULL 
0
SELECT t.sid as tsid, s.sid as ssid, s.name from song s LEFT JOIN tracklist t ON s.sid<>t.sid; 

它檢查s.sid的id是否爲空。如果你沒有給出身份證,那麼它不會返回它。

<>意味着不等於...

0

我認爲這應該工作:

SELECT t.sid as tsid, s.sid as ssid, s.name 
from song s LEFT OUTER JOIN tracklist t ON s.sid=t.sid where t.sid IS NULL; 
+0

'LEFT OUTER JOIN'只是另一種使用'LEFT JOIN'的方式。有些語言使用一種,一種使用另一種,而不是兩種。 – JMichelB

+0

我在oracle中使用(+),LEFT JOIN/INNER JOIN ...術語總是讓我困惑。感謝您的更正。這個想法是從歌曲中選擇所有的東西,但只選擇無效的曲目列表 –