【问题标题】:How to combine multiple rows from 3 tables into 1 string in SQL?如何在 SQL 中将 3 个表中的多行组合成 1 个字符串?
【发布时间】:2017-07-01 15:56:45
【问题描述】:

我有 3 个表:
- Movie(MovieID、MovieName 等)
-Genre(GenreID、GenreName 等)
- MovieGenre(映射表:MovieID 和 GenreID)。

基本上,一部电影可以有多种类型。
我一直在努力寻找列出所有电影及其所有类型的表的查询。我需要它通过 DataTable、SqlDataAdapter 将数据加载到 ASP.Net GridView。

例如:
1   银河护卫队   动作、冒险、科幻
2   钢铁侠           动作、冒险、奇幻

我是 SQL 新手,已经搜索过类似的问题,找到了一些答案,但仍然没有用。

【问题讨论】:

  • 请展示您自己的编码尝试、一些示例输入(即create table ....insert into ... 的一些行)、您得到的输出以及不满意的地方。您可能还想参加tour

标签: sql sql-server


【解决方案1】:

这对 SQL Server 来说是个痛点。一种方法是每行放置一种类型,但您明确希望将所有类型放在一行中。

select m.*,
       stuff( (select ', ' + g.genreName
               from moviegenre mg join
                    genres
                    on mg.genreid = g.genreid
               where mg.movieid = m.movieid
               for xml path ('')
              ), 1, 2, ''
            ) as genres
from movies m;

genres 不可能有特殊字符。因此可能不需要显式使用类型。

【讨论】:

    【解决方案2】:

    这是一种方法。使用for xml path('') 技巧将genrename 连接到逗号分隔值

    SELECT M.moviename, 
           Stuff(CS.genres, 1, 1, '') 
    FROM   movie M 
           CROSS apply(SELECT ',' + genrename 
                       FROM   moviegenre MG 
                              INNER JOIN genre G 
                                      ON MG.genreid = G.genreid 
                       WHERE  MG.movieid = M.movieid 
                       FOR xml path('')) CS (genres) 
    

    【讨论】:

      猜你喜欢
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多