【问题标题】:SQL Server 2008 combine multiple rows into 1 with commas + 3 tables [duplicate]SQL Server 2008用逗号将多行组合成1个+ 3个表[重复]
【发布时间】:2013-04-04 02:27:46
【问题描述】:

我有 3 张桌子:

电影数据库

movieID | Title
1       | Star War

StarringDB

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

名称数据库

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

【问题讨论】:

  • 您使用的是什么数据库?你试过什么?
  • @sybkar - 你读过标题吗?
  • @PM77-1 - 我确实看过标题,尽管我很确定他的意思是 MS SQL Server,但 SQL:2008 也是 SQL 标准 - 因为 Mike 是新用户,所以得到他走在正确的轨道上似乎是谨慎的
  • 由于 SQL Server 没有 MySql 的 GROUP_CONCAT 的直接类似物,因此您需要使用网络上发布的解决方法。请参阅stackoverflow.com/questions/273238/…stackoverflow.com/questions/12997884/… 等。

标签: sql sql-server-2008


【解决方案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

【讨论】:

  • 很好,我从未注意到 derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] 上的 column_alias 位
猜你喜欢
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2010-09-15
  • 2021-10-15
相关资源
最近更新 更多