我需要将数据从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。
答案 0 :(得分:2)
不同的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。
答案 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为ClassId
,StudentClass
链接表包含StudentId
和ClassId
。< / p>
编辑:您必须拥有包含学生和班级信息的某种表格,以便将两者链接在一起。无论是链接表还是每个学生只允许一个班级,那么ClassId
可能存储在学生表中。无论哪种方式,上述内容都可以帮助您解决问题。
答案 2 :(得分:0)
您的问题的答案是:不,它不能在标准SQL中完成。
这是因为你试图将多个值放入一个字段,这违反了第一个普通形式。
你可以使用非标准的sql来完成它,但每个数据库的sql会有所不同。
但是,您也可以使用SSRS中的Tablix(它可以使用相同的标准SQL访问Oracle和SQLServer中的表)。