Tsql 通过删除重复项和不逐行处理对两个csv字段进行排序
我尝试合并两个csv字段,消除重复项,排序并将其存储在新字段中 我能够做到这一点。然而,我遇到了一个场景,其中的值类似于abc和abc*。我需要把一个和abc*一起保留,把另一个拿走。 这是否可以在没有逐行处理的情况下实现 这是我的Tsql 通过删除重复项和不逐行处理对两个csv字段进行排序,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我尝试合并两个csv字段,消除重复项,排序并将其存储在新字段中 我能够做到这一点。然而,我遇到了一个场景,其中的值类似于abc和abc*。我需要把一个和abc*一起保留,把另一个拿走。 这是否可以在没有逐行处理的情况下实现 这是我的 CREATE TABLE csv_test ( Col1 VARCHAR(100), Col2 VARCHAR(100), Col3 VARCHAR(500) ); INSERT dbo.csv_te
CREATE TABLE csv_test
(
Col1 VARCHAR(100),
Col2 VARCHAR(100),
Col3 VARCHAR(500)
);
INSERT dbo.csv_test (Col1, Col2)
VALUES ('xyz,def,abc', 'abc*,tuv,def,xyz*,abc'), ('qwe,bca,a23', 'qwe,bca,a23*,abc')
--It is assumed that there are no spaces around commas
SELECT Col1, Col2, Col1 + ',' + Col2 AS Combined_NonUnique_Unsorted,
STUFF((
SELECT ',' + Item
FROM (SELECT DISTINCT Item FROM dbo.DelimitedSplit8K(Col1 + ',' + Col2,',')) t
ORDER BY Item
FOR XML PATH('')
),1,1,'') Combined_Unique_Sorted
, ExpectedResult = 'Keep the one with * and make it unique'
FROM dbo.csv_test;
--Expected Results; if there are values like abc and abc* ; I need to keep abc* and remove abc ;
--How can I achieve this without looping or using temp tables?
abc,abc*,def,tuv,xyz,xyz* -> abc*,def,tuv,xyz*
a23,a23*,abc,bca,qwe -> a23*,abc,bca,qwe
嗯,既然您同意规范化数据库是正确的做法,我决定尝试为您提供一个解决方案。
我最终得到了一个相当麻烦的解决方案,涉及4个(!)通用表表达式——虽然麻烦,但它可以工作 第一个cte是添加表中缺少的行标识符-为此,我使用了
row_NUMBER()OVER(ORDER BY Col1,Col2)
。第二个cte是通过组合两个csv列来获得一组唯一的值。请注意,这还不能处理
*
部分。第三方cte正在处理
*
问题。最后,第四个cte将把所有独特的项目放回一个csv中。(我可以在第三个cte中完成,但我想让每个cte负责解决方案的一个部分——它更具可读性。) 现在只剩下将第一个cte的
Col3
更新为第四个cte的组合的\u Unique\u排序的
:
;WITH cte1 as
(
SELECT Col1,
Col2,
Col3,
ROW_NUMBER() OVER(ORDER BY Col1, Col2) As rn
FROM dbo.csv_test
), cte2 as
(
SELECT rn, Item
FROM cte1
CROSS APPLY
(
SELECT DISTINCT Item
FROM dbo.DelimitedSplit8K(Col1 +','+ Col2, ',')
) x
), cte3 AS
(
SELECT rn, Item
FROM cte2 t0
WHERE NOT EXISTS
(
SELECT 1
FROM cte2 t1
WHERE t0.Item + '*' = t1.Item
AND t0.rn = t1.rn
)
), cte4 AS
(
SELECT rn,
STUFF
((
SELECT ',' + Item
FROM cte3 t1
WHERE t1.rn = t0.rn
ORDER BY Item
FOR XML PATH('')
), 1, 1, '') Combined_Unique_Sorted
FROM cte3 t0
)
UPDATE t0
SET Col3 = Combined_Unique_Sorted
FROM cte1 t0
INNER JOIN cte4 t1 ON t0.rn = t1.rn
要验证结果,请执行以下操作:
SELECT *
FROM csv_test
ORDER BY Col1, Col2
结果:
Col1 Col2 Col3
qwe,bca,a23 qwe,bca,a23*,abc a23*,abc,bca,qwe
xyz,def,abc abc*,tuv,def,xyz*,abc abc*,def,tuv,xyz*
不要。阅读,你会看到很多原因,为什么这个问题的答案绝对是肯定的!你需要规范化你的数据库,以摆脱这种暴行。同意。新的设计考虑了规范化。然而,在那之前,我们一直被困在这一点上。所以,我只是想在这方面帮助一位同事和我自己学习一些棘手的事情。