【发布时间】:2014-11-18 06:37:32
【问题描述】:
我有一个包含学生记录的(临时)表。
还有另一个表,其中包含哪些学生注册了哪些科目。
我想用汇总到其中的科目来更新学生表,如下所示。
StudentID Name Subjects
1 Ryan
2 James
StudentID Subject
1 Maths
1 Science
2 History
StudentID Name Subjects
1 Ryan Maths, Science
2 James History
我已经尝试过了,但它只会在找到第一条记录时更新。聚合不会发生。
declare @Subjects NVARCHAR(max) = ''
UPDATE #Students
SET Subjects = (@Subjects + CASE @Subjects WHEN '' THEN '' ELSE '; ' END + ISNULL(StudentSubjects.Subject,' '))
FROM #Students
INNER JOIN StudentSubjects ON #Students.StudentID = StudentSubjects.StudentID
SQL Server 2008 R2。
编辑:
我正在更新存储过程中的临时表,该存储过程将在结果集中呈现出来。 不更新实际数据。
【问题讨论】:
-
这是个坏主意,我不想教你怎么做。您不应将逗号分隔的列表存储在列中。
-
您不应将这些结果永久存储在数据库中。您可以使用此问题中的技术创建视图 - stackoverflow.com/questions/17591490/…
-
更新了我的问题,使其更清楚,戈登和布拉特。显然,将 temp 放在括号中并没有给人留下任何印象,即要更新的数据的性质是暂时的!
-
重点是这是一个重复的问题。
标签: sql sql-server-2008 aggregate-functions group-concat sql-server-group-concat