编辑:这不是动态输出,输出视图结构是固定的。
我正在尝试创建一个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
但是这会为每个问题返回一行 - 它不会将它们压缩到一行。我玩了几个不同的联接,但是没能得到我想要的行为。
是否可以在视图中执行此操作?
我需要做些什么来实现它?
谢谢!
答案 0 :(得分:3)
没有这样的加入。 SQL具有固定的列输出:因此您无法添加列数的arbritrary。无论是直接观点还是存储过程都无关紧要。
有两个主要选项
连接many rows into one column这是SO上的热门问题。 One random solution using XML PATH
使用dynamic SQL to add a column per row in a stored procedure。
注意: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.html和http://blog.sqlauthority.com/2008/05/22/sql-server-pivot-table-example/
虽然在编写PIVOT之前需要知道AssessmentId