group by没有聚合函数和行分组

时间:2018-01-30 12:50:02

标签: sql sql-server tsql

大家好我有一张有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不是常量,并且它们根据操作员输入一直在变化,因此我无法真正指定我只需要找到一种编写代码的方法来编写所有的表中的类似loadid并将该loadID的注释连接在一起,所以基本上我希望输出看起来像这样

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

2 个答案:

答案 0 :(得分:3)

在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()'。说实话,我根本就没有使用过这种结构。

答案 1 :(得分:0)

使用Distinct Keyword删除重复项

select distinct LoadId,(SELECT coment + ',' AS 'data()' FROM TB_SOT_Comment Where LoadID = t.LoadID FOR XML PATH('')) from TB_SOT_Comment t