对于oracle sql左连接的一点认识

来源:互联网 发布:三星系统升级软件 编辑:程序博客网 时间:2024/06/06 05:14

我们在连表的时候,可能有这样的需求,比如我要查询歌曲的信息,有张Song表,但是我需要返回的额数据不仅仅是Song的信息,可能还有专辑的信息,这时候我们就需要使用到左连接。左连接就是不管右边表有没有对应的 都要展示出左边的表的数据。左边的表就是我们要连接的主表。
有这样的sql:
SELECT /+ parallel(10)/
DISTINCT AL.ALBUM_ID,AL.ALBUM_NAME,(SELECT to_char(WM_CONCAT(T.ARTIST_ID ||’:’ || T.ARTIST_NAME))
FROM MUSIC_R_ARTIST MR, ARTIST T
WHERE M.MUSIC_ID = MR.MUSIC_ID(+)
AND MR.ARTIST_ID = T.ARTIST_ID AND MR.ARTIST_TYPE = 1) ARTIST_ID,
M.MUSIC_ID,M.LENGTH,M.MUSIC_NAME,M.SINGER_NAME,M.RANK_NUM,M.PUBLISH_YEAR
FROM
MUSIC M,
MUSIC_R_ARTIST R,
ALBUM AL,
ALBUM_R_MUSIC RM,
ARTIST_R_TYPE AR
where
M.MUSIC_ID = R.MUSIC_ID(+)
AND M.MUSIC_ID = RM.MUSIC_ID(+)
AND AL.ALBUM_ID= RM.ALBUM_ID
AND R.ARTIST_ID = AR.ARTIST_ID
AND M.STATUS = 1
AND AR.TYPE_ID = 1
(+)就是左连接的表示,(+)在右边就标志着左边的表示左连接的表,
当然还有一种写法left join A on A.id = M.id and… 他们的区别就死后者可以写多个连接条件。前者只能写一个连接条件。

在此之前,我喜欢这样去写sql,当然我知道主表是music表。应该返回所有music表中满足条件的数据所以只要是跟M.MUSIC_ID相关的条件,我都会加上(+)标识,但是我忽略了AND AL.ALBUM_ID= RM.ALBUM_ID AND R.ARTIST_ID = AR.ARTIST_ID 这两条语句,没加外连接标识,也可能到时song表的数据某些查不出来。AND AL.ALBUM_ID(+) = RM.ALBUM_ID AND R.ARTIST_ID = AR.ARTIST_ID(+) 这样加上该出来的就出来了。