得到与在空值和左的连接

问题描述:

让我们有这个疑问得到与在空值和左的连接

select music,fav from MUSIC music 

     left join Favorite_Music fav on fav.id_music = music.id_music 

     where fav.id_user= 22 or fav.id_user is NULL 

我的表Music

id_music | .... 

    1  | 
    ... | 
    100 | 

我的表Favorite_Music

id_fav | id_music | id_user 

1  | 15  | 22 
2  | 20  | 22 
3  | 40  | 30 

我想检索所有MUSIC对于一些我想标记我最喜欢的音乐的东西user 22

但是,当我执行上面的查询music40不包括在内!

所以我想得到所有的music,并得到空值为Favorite_Music这是不是我的22用户。

+0

的'id_user'有排在你期望从'id_music'列中检索'40'的'30'值? – SeeSharp 2014-12-18 23:07:12

+0

是的,就像我在我的问题中显示的那样,我也想检索这一行 – Youssef 2014-12-18 23:10:46

+0

在你的'Favourite_Music'表中,为什么你期望当'或者fav.id_user为NULL'时返回第三行构成你的'WHERE'子句的一部分?在这种情况下,该值不为空,它是'30' 除非我非常误解你想要达到的目标。 – SeeSharp 2014-12-18 23:12:44

您必须将过滤器应用于join子句中的外连接表,而不是where子句。就像这样:

select music,fav 
from MUSIC music 
left join Favorite_Music fav on fav.id_music = music.id_music 
and (fav.id_user= 22 or fav.id_user is NULL) 

当你在where子句中,这似乎是一个明显的事情,你的外部过滤器连接成为一个隐含的内部联接。

+0

不同时,我想要得到空值,就像@GordonLinoff在没有'fav.id_user是NULL'的情况下回答它的工作。 – Youssef 2014-12-18 23:41:03

这是我想你想查询:

select music, (case when fav.id_user is not null then 'No' else 'Yes' end) as IsFav22 
from MUSIC music left join 
    Favorite_Music fav 
    on fav.id_music = music.id_music and fav.id_user = 22; 
+0

谢谢你的工作。 – Youssef 2014-12-18 23:37:10