SQL:将连接表的id聚合成一个字符串

时间:2012-03-16 15:05:27

标签: sql join csv export

我需要将数据从SQL数据库(某些组使用SQL Server,某些Oracle等)导出到CSV中,我需要字符串中连接表中的id。

例如,我有一个Classes表和一个Student表。从课程,我需要ID,姓名,部分,时间,并且从学生我需要在课堂上学生ID的字符串。结果将返回列:id,name,section,time,student_ids。 'student_ids'列应该是分隔的字符串,例如:

'32,43,53,12,41'

行输出最终会像:

"1405,Computer Science,101,12-1:30,'32,43,53,12,41'"

每班学生人数不一致,可能有一名学生,即20名学生。我想过使用SQL Server来获取这些数据的while循环,或者是聚合键的临时表,但是我想知道是否有任何方法可以使用标准SQL来实现这一点,这样脚本就可以移植了。 / p>

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

3 个答案:

答案 0 :(得分:2)

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

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

在Firebird中,您拥有LIST聚合函数。

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

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

答案 1 :(得分:1)

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

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

这假定您的ClassTable ID为ClassIdStudentClass链接表包含StudentIdClassId。< / p>

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

答案 2 :(得分:0)

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

这是因为你试图将多个值放入一个字段,这违反了第一个普通形式。

你可以使用非标准的sql来完成它,但每个数据库的sql会有所不同。

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