2013-04-11 62 views
0

我有3个表:SQL Server 2008的多行合并成1用逗号+ 3个表

MovieDB

movieID | Title 
1  | Star War 

StarringDB

movie ID | nameID 
1  | 1 
1  | 2 
1  | 3 
1  | 4 
1  | 5 

nameDB

nameID | Name 
1  | Harrison Ford 
2  | Mark Hamill 
3  | Carrie Fisher 
4  | Peter Cushing 
5  | Alec Guinness 

我想输出是:

ID | Title | Starrings 
1 | Star War | Harrison Ford, Mark Hamill, Carrie Fisher, Peter Cushing, Alec Guinness 
+1

什么数据库您使用的?你有什么尝试? – sybkar 2013-04-11 18:49:46

+0

@sybkar - 你看过标题吗? – 2013-04-11 18:51:07

+0

@ PM77-1 - 我确实读过这个标题,虽然我很确定他的意思是MS SQL Server,但SQL:2008也是一个SQL标准 - 因为Mike是一个新用户,让他在正确的轨道上开始似乎谨慎 – sybkar 2013-04-11 18:54:20

回答

1

SQL Server不具有将串联的价值为你的函数,所以你可以使用FOR XML PATH得到结果:

select m.movieID, 
    m.title, 
    STUFF((SELECT ', ' + n.name 
     from name n 
     inner join starring s 
      on n.nameID = s.nameid 
     where s.movieID = m.movieID 
     group by n.name, n.nameid 
     order by n.nameid 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,2,'') starrings 
from movie m; 

参见SQL Fiddle with Demo

或者你可以使用FOR XML PATHCROSS APPLY

select m.movieID, 
    m.title, 
    left(c.stars, len(c.stars)-1) stars 
from movie m 
cross apply 
(
    select n.name + ', ' 
    from name n 
    inner join starring s 
    on n.nameID = s.nameid 
    where s.movieID = m.movieID 
    group by n.name, n.nameid 
    order by n.nameid 
    FOR XML PATH('') 
) c (stars); 

SQL Fiddle with Demo

+0

不错,我从来没有注意到'derived_table [AS] table_alias [(column_alias [,... n])]'上的column_alias位' – 2013-04-11 19:50:40