-1

我们目前正在升级我们用 C# 编写的当前数据导入过程。

作为升级过程的一部分,我们需要根据旧系统的结果检查重写的导入过程的结果。

我们所做的更改之一是将逗号分隔的列表拆分为另一个表中的行。这将使我们能够使用简单的连接过滤结果。

这是旧模式:

FormNumber      MainCategories
1               blue,green,red
2               yellow,red,blue
3               white

我们将其标准化为:

FormNumber      AttributeId      Value
1               1                blue
1               1                green
1               1                red
2               1                yellow
2               1                red
2               1                blue
3               1                white

现在,我们的下一步是确认这两个过程的结果是否相同。其中一项检查是将旧流程的 MainCategories 字段与规范化表的结果进行比较。

最后,这将我们引向一个问题:如何创建新模式的逗号分隔列表以与旧模式的值进行比较。

我们在这里尝试了@Ritesh 提出的 XMLPath 解决方案:Concatenate many rows into a single text string?

这是改编的sql语句:

Select distinct ST2.FormNumber, 
           (Select ST1.Value + ',' AS [text()]
            From cache.ArtifactAttribute ST1
            Where ST1.FormNumber= ST2.FormNumber
            ORDER BY ST1.FormNumber
            For XML PATH ('')) [Values]
     From cache.ArtifactAttribute ST2

问题是结果不正确。尽管 FormNumber 1 在表中只有三个条目,但 Values 列(动态构建的分隔字符串)显示不正确的结果。显然我们没有正确实现 sql 代码。

我们做错了什么?

4

2 回答 2

1

这对我来说似乎很好用:

DECLARE @s TABLE(FormNumber int, AttributeId int, Value varchar(32));

INSERT @s VALUES
(1,1,'blue'),
(1,1,'green'),
(1,1,'red'),
(2,1,'yellow'),
(2,1,'red'),
(2,1,'blue'),
(3,1,'white');

SELECT ST2.FormNumber, [Values] = STUFF(
      (SELECT ',' + ST1.Value AS [text()]
         FROM @s ST1
         WHERE ST1.FormNumber = ST2.FormNumber
         ORDER BY ST1.FormNumber
         FOR XML PATH (''),
         TYPE).value(N'./text()[1]', N'varchar(max)'), 1, 1, '')         
FROM @s ST2 GROUP BY ST2.FormNumber;

结果:

表格编号 价值观
1 蓝色,绿色,红色
2 黄色,红色,蓝色
3 白色的
于 2012-08-31T17:33:33.007 回答
1

您可以尝试以下方法:

SELECT DISTINCT A.FormNumber, MainCategories
FROM YourTable A
CROSS APPLY (SELECT STUFF((SELECT ',' + Value 
                           FROM YourTable
                           WHERE FormNumber = A.FormNumber FOR XML PATH('')),1,1,'') MainCategories) B

尽管存在一个问题,即您不能真正确定连接的项目的顺序是否与您所拥有的相同,因为没有一列明确给出该顺序。这是此示例的有效SQL Fiddle

于 2012-08-31T17:35:10.993 回答