我需要从SQL数据库导出数据(一些组使用SQL Server,一些Oracle等)转换为CSV,其中我需要字符串形式的连接表中的id。
例如,我有一个班级表和一个学生表。在Classes中,我需要ID、Name、Section、Time,而在Students中,我需要一个班级中学生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来实现这一点,以便脚本可以移植。
注意:我知道输出格式并不理想,但唯一的其他选择是,我们必须为每个Class/Student组合提取不同的记录,然后必须分别聚合id。
发布于 2012-03-16 15: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。
发布于 2012-03-16 15:15:47
如果是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
这里假设您有一个ID为ClassId
的ClassTable
,以及一个同时包含StudentId
和ClassId
的StudentClass
链接表。
编辑:您必须具有包含学生和班级信息的某种类型的表,以便将两者链接在一起。或者是一个链接表,或者如果每个学生只允许一个类,那么ClassId
可能存储在学生表中。无论哪种方式,上述方法都可以帮助你解决问题。
发布于 2012-03-16 15:13:54
您的问题的答案是:不,它不能用标准SQL完成。
这是因为您试图将多个值放入单个字段中,这违反了第一范式。
您可以使用非标准sql来完成此操作,但是每个数据库的sql都不同。
但是,您也可以使用SSRS中的表(它可以使用相同的标准SQL来访问Oracle和SQLServer中的表)。
https://stackoverflow.com/questions/9739722
复制