【问题标题】:SQL Server - Many to Many query into 1 rowSQL Server - 多对多查询到 1 行
【发布时间】:2016-07-10 05:57:48
【问题描述】:

我有 3 张桌子

电影:

  • Movie_id
  • 标题
  • 运行时
  • Date_id
  • ...

类型:

  • 流派_id
  • 类型

电影类型:

  • Movie_id
  • 流派_id

我想将它们放在一行中,以便每个流派由一列分隔 像这样:

Movie_id | Title | Genre1 | Genre2 | Genre3 | Genre4 |

每部电影可能有也可能没有多达 4 种类型。

我很接近这种方法:

SELECT
    Movies.Movie_id,
    MAX(Movies.Title),
    MAX(CASE WHEN p.RowNum=1 THEN p.Genre_id END) as Genre1,
    MAX(CASE WHEN p.RowNum=2 THEN p.Genre_id END) as Genre2,
    MAX(CASE WHEN p.RowNum=3 THEN p.Genre_id END) as Genre3,
    MAX(CASE WHEN p.RowNum=4 THEN p.Genre_id END) as Genre4
FROM 
    Movies
JOIN
    (SELECT 
         Movie_Genre.*,
         ROW_NUMBER() OVER (PARTITION BY Movie_id ORDER BY Genre_id) AS RowNum
     FROM 
         Movie_Genre) AS P ON Movies.Movie_id = p.Movie_id
GROUP BY  
    Movies.movie_id      

但我最终得到的是 Genre_id 而不是流派名称。

标题栏也没有命名

【问题讨论】:

  • 样本数据和输出将使我们的生活更轻松

标签: sql sql-server


【解决方案1】:

INNER JOIN 到子查询中的 Genre 表

select  Movies.Movie_id,
        Movies.Title,
        MAX(CASE WHEN p.RowNum=1 THEN p.Genre END) as Genre1,
        MAX(CASE WHEN p.RowNum=2 THEN p.Genre END) as Genre2,
        MAX(CASE WHEN p.RowNum=3 THEN p.Genre END) as Genre3,
        MAX(CASE WHEN p.RowNum=4 THEN p.Genre END) as Genre4
FROM    Movies
    INNER JOIN
    (
        SELECT  mg.Movie_id, g.Genre,
                ROW_NUMBER() OVER (PARTITION BY mg.Movie_id ORDER BY mg.Genre_id) 
                as RowNum
        FROM    Movie_Genre mg
                INNER JOIN Genre g  on  mg.Genre_id = g.Genre_id
    ) as P  ON Movies.Movie_id=p.Movie_id
GROUP BY Movies.movie_id, Movies.Title      

【讨论】:

  • 在第 10 行的 g.genre 之后需要一个逗号,但除此之外它还有效。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多