sql - 没有聚合函数和行分组的分组依据

标签 sql sql-server t-sql

大家好,我有一个有 2 列的表格

LoadID      coment
1234        comment1
1234        comment2
1234        comment3
12345       comment4
28366356    comment5
28366356    comment6
1212        comment7

我正在尝试运行此代码来获取特定 LoadID 的注释以将其组合在一起,应如下所示(comment1、comment2、comment3)

SELECT coment + ',' AS 'data()'
FROM TB_SOT_Comment
Where LoadID = '1234'
FOR XML PATH('')

代码工作正常,但问题是我想更改 where 子句以对所有 loadID 执行相同的操作。问题是 loadID 不是常量,它们总是根据运算符(operator)输入而变化,因此我无法真正指定数字,我只需要找到一种方法来编写将表中所有类似的 loadid 分组的代码,并且将 loadID 的注释连接在一起,所以基本上我希望输出看起来像这样

LoadID      coment
1234        comment1,comment2,comment3
12345       comment4
28366356    comment5,comment6
1212        comment7

最佳答案

在 SQL Server 中(最新版本之前),您将使用相关子查询:

SELECT l.LoadId,
       STUFF( (SELECT ',' + comment -- AS 'data()'
               FROM TB_SOT_Comment c2
               WHERE c2.LoadID = l.LoadId
               FOR XML PATH ('')
              ), 1, 1, ''
            ) as comments
FROM (SELECT DISTINCT LoadId FROM TB_SOT_Comment) l;

注释:

  • 相关子句(内部 WHERE)是此查询的关键。
  • 我添加了 STUFF(),因此注释不会以逗号结尾。
  • 不同的负载来自子查询。这样效率更高,因为子查询每次加载仅运行一次。
  • 我注释掉了AS 'data()'。老实说,我根本没有使用过这个构造。

关于sql - 没有聚合函数和行分组的分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48521913/

相关文章:

SQL 乘法后丢失小数

sql-server - 返回 "default"记录集的 SQL 查询

sql - 存储在数据库中的用户权限

sql - 仅当按顺序排列时才省略重复项

java - 根据列值不同的集合

sql - 微软 SQL : The best way to delete rows from a ginormous table

sql - 为什么在SQL Server中像 `select last`一样没有 `select bottom`或 `select top`?

sql-server - 删除表中的所有行

SQL Server 2008 - 电子邮件通知

sql - 是否可以在 Sql Server 中的 View 内设置变量?