连接表时的 SQL 聚合

Posted

技术标签:

【中文标题】连接表时的 SQL 聚合【英文标题】:SQL Aggregate while joining tables 【发布时间】: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。 编辑: 我正在更新存储过程中的临时表,该存储过程将在结果集中呈现出来。 不更新实际数据

【问题讨论】:

这是个坏主意,我不想教你怎么做。您不应将逗号分隔的列表存储在列中。 您不应将这些结果永久存储在数据库中。您可以使用此问题中的技术创建视图 - ***.com/questions/17591490/… How to use GROUP BY to concatenate strings in SQL Server?的可能重复 更新了我的问题,使其更清楚,戈登和布拉特。显然,将 temp 放在括号中并没有给人留下任何印象,即要更新的数据的性质是暂时的! 重点是这是一个重复的问题。 【参考方案1】:

我希望下面的查询对你有用

UPDATE #Students
SET Subjects = STUFF((SELECT ','+Subject From StudentSubjects b WHERE b.StudentID=a.StudentID 
For XML PATH ('')),1,1,'') 
from #Students a

【讨论】:

以上是关于连接表时的 SQL 聚合的主要内容,如果未能解决你的问题,请参考以下文章

连接两个表的字符串的聚合函数?

SQL - 将聚合表与非聚合表连接起来

查询多表时如何准确使用聚合函数?

sql聚合函数的使用

如何对 sql 连接进行聚合?

SELECT 子句中不存在聚合函数时的 GROUP BY 行为