我们目前正在升级我们用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在表中只有三个条目,但“值”列(动态构建的分隔字符串)显示的结果不正确。显然我们没有正确实现sql代码。
我们做错了什么?
答案 0 :(得分: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 distinct ST2.FormNumber,
STUFF((Select ',' + ST1.Value AS [text()]
From @s ST1
Where ST1.FormNumber= ST2.FormNumber
ORDER BY ST1.FormNumber
For XML PATH ('')), 1, 1, '') [Values]
From @s ST2;
结果:
FormNumber Values
1 blue,green,red
2 yellow,red,blue
3 white
您确定您的数据是您认为的吗?您能否显示不给出预期结果的样本数据?
答案 1 :(得分: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。