首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

头晕,跨5个表的查询!求救!该如何解决

2012-01-21 
头晕,跨5个表的查询!求救!表A:Artist(歌手表)IDName--------------1张学友..

头晕,跨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
D.ArtistID=1
and


B.ID=D.AlbumID
and
E.AlbumID=D.AlbumID
and
Exists(select 1 from Song_URL where SongID=E.SongID)
[解决办法]
头晕,跨5个表的查询,我每次都写不来,太复杂了,所以我都是用在视图里面用鼠标拖,最后生成的Sql语句copy出来修改一下加上where条件,其实这真的是个好办法
[解决办法]
定义一个视图

热点排行