【问题标题】:SQL: aggregate a joined table's id's into a stringSQL:将连接表的 id 聚合成一个字符串
【发布时间】:2012-04-02 03:23:10
【问题描述】:

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

例如,我有一个班级表和一个学生表。在班级中,我需要 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 来完成此操作,以便脚本可以移植。

注意:我知道输出格式并不理想,但唯一的其他选择是我们必须为每个班级/学生组合提取不同的记录,然后必须单独汇总 id。

【问题讨论】:

  • 什么种类的SQL? MySQL 有 GROUP_CONCAT() 例如。另外,一旦生成,您将如何使用它?我们或许可以提供替代流程。
  • @Dems 不幸的是,SQL 的种类各不相同,尽管几乎总是 Oracle 或 SQL Server 的一个版本
  • @Dems 另外,使用导出作为以标准化格式接收数据的一种方式,不幸的是,不能使用像“class_student”这样的附加导出

标签: sql join csv export


【解决方案1】:

不同的 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

【讨论】:

    【解决方案2】:

    如果是 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 链接表,其中包含 StudentIdClassId

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 2011-07-24
        相关资源
        最近更新 更多