首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SQL:将连接表的id聚合到一个字符串中

SQL:将连接表的id聚合到一个字符串中
EN

Stack Overflow用户
提问于 2012-03-16 23:05:27
回答 3查看 1.7K关注 0票数 3

我需要从SQL数据库导出数据(一些组使用SQL Server,一些Oracle等)转换为CSV,其中我需要字符串形式的连接表中的id。

例如,我有一个班级表和一个学生表。在Classes中,我需要ID、Name、Section、Time,而在Students中,我需要一个班级中学生ID的字符串。结果将返回以下列: id、name、section、time、student_ids。“student_ids”列应为分隔字符串,例如:

代码语言:javascript
代码运行次数:0
运行
复制
'32,43,53,12,41'

行输出将以如下形式结束:

代码语言:javascript
代码运行次数:0
运行
复制
"1405,Computer Science,101,12-1:30,'32,43,53,12,41'"

每个班级的学生数量不一致,可能有一个学生,也可能有20个学生。我考虑过使用SQL Server使用while循环来获取此数据,或者使用聚合键的临时表,但我想知道是否有任何方法可以使用标准SQL来实现这一点,以便脚本可以移植。

注意:我知道输出格式并不理想,但唯一的其他选择是,我们必须为每个Class/Student组合提取不同的记录,然后必须分别聚合id。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-16 23:12:05

不同的RDBMS有不同的方式来执行这种查询。

如果您使用的是MySQL,那么您应该看看GROUP_CONCAT聚合函数。

在Firebird中,有LIST聚合函数。

如果您使用的是SQL Server,在sql-server-group-concat下的SO中有一些已回答的问题。通常的方法是使用FOR XML PATH构造。一个很好的例子是:SQL Query to get aggregated result in comma seperators along with group by column in SQL Server

在Oracle中有几种方法可以做到这一点,有一篇很好的文章here

票数 2
EN

Stack Overflow用户

发布于 2012-03-16 23:15:47

如果是SQL Server,我倾向于这样做:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT c.classID, c.other columns,
STUFF((SELECT ',' + convert(varchar,StudentID) 
    FROM StudentClass sc where c.ClassId = sc.ClassID
    FOR XML PATH('')),1,1,'') as StudentIdList
from ClassTable c

这里假设您有一个ID为ClassIdClassTable,以及一个同时包含StudentIdClassIdStudentClass链接表。

编辑:您必须具有包含学生和班级信息的某种类型的表,以便将两者链接在一起。或者是一个链接表,或者如果每个学生只允许一个类,那么ClassId可能存储在学生表中。无论哪种方式,上述方法都可以帮助你解决问题。

票数 1
EN

Stack Overflow用户

发布于 2012-03-16 23:13:54

您的问题的答案是:不,它不能用标准SQL完成。

这是因为您试图将多个值放入单个字段中,这违反了第一范式。

您可以使用非标准sql来完成此操作,但是每个数据库的sql都不同。

但是,您也可以使用SSRS中的表(它可以使用相同的标准SQL来访问Oracle和SQLServer中的表)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9739722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档