2011-08-09 144 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 ...术语总是让我困惑。感谢您的更正。这个想法是从歌曲中选择所有的东西,但只选择无效的曲目列表 –