日期:2014-05-18  浏览次数:20615 次

头晕,跨5个表的查询!求救!
表A:   Artist   (歌手表)
============================
ID               Name
-------     -------
1                 张学友
...

表B:   Album   (专辑表)
============================
ID               Name
-------     -------
1                 群星荟萃
2                 吻别
3                 张学友93演唱会
...

表C:   Song   (歌曲表)
============================
ID               Name
-------     -------
1                 每天爱你多一些
2                 吻别
3                 爱火花

表D:   Artist_Album   (歌手与专辑关联表,多对多关系)
============================
ArtistID   AlbumID
-------     -------
1                 1
1                 2
1                 3

表E:   Album_Song   (专辑与歌曲关联表,多对多关系)
============================
AlbumID     SongID
-------     -------
1                 2
2                 2
2                 3
3                 2
3                 3

表F:   Song_URL   (歌曲下载链接关联表,一对多关系)
============================
ID               SongID       URL
-------     -------     --------
1                 1                 http://...
2                 1                 http://...
3                 3                 http://...
4                 3                 http://...
5                 3                 http://...

跨5个表查询:   查询歌手ID为   1   的所有含有下载链接歌曲的专辑列表!

是不是感觉很绕啊!是啊,我就是被绕晕了,高手帮忙啊!

思路  
1,通过歌手ID找到所有歌手的专辑列表
2,通过每张专辑的ID找到每张专辑的歌曲列表
3,通过歌曲ID查询下载链接表是否有下载链接
如果一张专辑下所有歌曲都没有下载链接则不显示这张专辑
如果一张专辑下任意一首歌有下载链接则显示此专辑

------解决方案--------------------
declare @ArtistID varchar(32) --歌手ID
set @ArtistID=1
select AlbumID=ID, AlbumName=[Name] from Album
where exists(
select 1 from Artist_Album join Album_Song on Artist_Album.AlbumID=Album_Song.AlbumID
join Song_URL on Album_Song.SongID=Song_URL.SongID
where Artist_Album.ArtistID=@ArtistID and Artist_Album.AlbumID=Album.ID
)
------解决方案--------------------
select
B.*
from
Album B,
Artist_Album D,
Album_Song E
where