我需要什么样的SQL连接来将一对多关系压缩到同一视图行?

时间:2011-02-02 10:59:38

标签: sql sql-server sql-server-2005 join

编辑:这不是动态输出,输出视图结构是固定的。

我正在尝试创建一个SQL Server视图,为每个用户显示一个固定的列行,并将关联的一个到多个表展平到该行中。

虽然关联表具有一对多的关系,但输出表结构限制为该表的4个元素。

我的表结构如下:

User (Id, FirstName, LastName)
Assessment (Id, Date, Location, User_Id)
Topics (Id, Topic, Assessment_Id)

评估通过User_Id(One 2 One)加入用户,并且评估由评估_Id加入评估。

因此,如果我有三个评估主题,我希望视图看起来像:

User_Id | FirstName | LastName | Date   | Location | Topic1 | Topic2  | Topic3 | Topic4 |
    1   |  dave     |  toby    | 2/2/11 | In situ  | apples | pears   | lemons | NULL   |

我当前的SQL看起来像这样:

SELECT  User.Id, User.FirstName, User.LastName, Assessment.Date, Assessment.Location, Topic.Topic
FROM   User LEFT OUTER JOIN
           Assessment INNER JOIN
              Topic ON Assessment.Id = Topic.Assessment_Id ON 
                  User.Id = Assessment.User_Id

但是这会为每个问题返回一行 - 它不会将它们压缩到一行。我玩了几个不同的联接,但是没能得到我想要的行为。

是否可以在视图中执行此操作?
我需要做些什么来实现它?

谢谢!

2 个答案:

答案 0 :(得分:3)

没有这样的加入。 SQL具有固定的列输出:因此您无法添加列数的arbritrary。无论是直接观点还是存储过程都无关紧要。

有两个主要选项

  1. 连接many rows into one column这是SO上的热门问题。 One random solution using XML PATH

  2. 使用dynamic SQL to add a column per row in a stored procedure

  3. 注意:PIVOT也是固定列输出

    编辑:最多4个子行

    SELECT 
      P.col1, P.col2,
      C1.col1 AS Topic1,
      C2.col1 AS Topic2,
      C3.col1 AS Topic2,
      C4.col1 AS Topic4
    FROM
      Parent P
      LEFT JOIN
      Child C1 ON P.Key = C1.FKey AND C1.ID = 1
      LEFT JOIN
      Child C2 ON P.Key = C2.FKey AND C2.ID = 2
      LEFT JOIN
      Child C3 ON P.Key = C3.FKey AND C3.ID = 3
      LEFT JOIN
      Child C4 ON P.Key = C4.FKey AND C4.ID = 4
    

    您也可以使用PIVOT,但我更喜欢更简单的自我加入。

答案 1 :(得分:2)

查看PIVOT表功能 - 例如http://www.help-sql.info/27/9/610208.htmlhttp://blog.sqlauthority.com/2008/05/22/sql-server-pivot-table-example/

虽然在编写PIVOT之前需要知道AssessmentId