按升序获取连接的行

17 浏览
0 Comments

按升序获取连接的行

可能是重复问题:

SQL Server:我可以将多行用逗号分隔成一列吗?

脚本:

CREATE TABLE Category (
  ID int,
  ErrorMessage nvarchar(200)
)
INSERT INTO Category 
  (ID, ErrorMessage)
VALUES
  (1, 'efgh')
INSERT INTO Category 
  (ID, ErrorMessage)
VALUES
  (1, 'abcd')
INSERT INTO Category 
  (ID, ErrorMessage)
VALUES
  (1, 'ijkl')
INSERT INTO Category 
  (ID, ErrorMessage)
VALUES
  (2, 'efgh')
INSERT INTO Category 
  (ID, ErrorMessage)
VALUES
  (2, 'abcd')
INSERT INTO Category 
  (ID, ErrorMessage)
VALUES
  (2, 'ijkl')

期望的输出:

Id                 ErrorMessage
----------------------------------
1                  abcd,efgh,ijkl
2                  abcd,efgh,ijkl

注意,类别ID被分组,并且按逗号分隔的消息按升序排列。

0
0 Comments

在上述代码中,我们可以看到一个问题:当我们将A表按照ID进行分组后,想要获取每组中的ErrorMessage,并将其拼接成一个以逗号分隔的字符串时,结果并不是按照ErrorMessage的升序排列的。

这个问题的出现原因是在拼接字符串的过程中,我们没有明确指定按照ErrorMessage进行排序,而是按照A表的ID进行排序的。这导致了最终拼接出来的字符串的顺序与我们期望的不符。

为了解决这个问题,我们可以在拼接字符串的代码中添加一个ORDER BY子句,来明确指定按照ErrorMessage进行排序。修改后的代码如下:

select A.ID, STUFF((
    select ','+B.ErrorMessage
    from Category B
    where B.ID = A.ID
    order by B.ErrorMessage
    for xml path ('a'), type).value('.','nvarchar(max)'),1,1,'')
from Category A
group by A.ID
order by A.ID

通过添加order by B.ErrorMessage,我们可以确保在拼接字符串时,ErrorMessage按照升序排列。这样,得到的拼接结果就是按照ErrorMessage的升序排列的。

0
0 Comments

问题的原因是,使用了XML Path函数将多个行连接在一起时,可能会出现XML实体编码的问题。

解决方法是,使用FOR XML PATH的参数TYPE和VALUE属性,将XML类型和值提取出来。这样可以避免XML实体编码的问题。

以下是修改后的代码示例:

Select C.Id
    , Stuff(
        (
        Select ', ' + C1.ErrorMessage
        From Category As C1
        Where C1.Id = C.Id
        Order By C1.ErrorMessage
        For Xml Path(''), TYPE).value('.', 'NVARCHAR(MAX)')
        ), 1, 2, '') As Categories
From Category As C
Group By C.Id

通过使用FOR XML PATH的TYPE和VALUE属性,我们可以避免XML实体编码的问题,从而正确地获取按升序排列的连接行。

0