Tsql 通过删除重复项和不逐行处理对两个csv字段进行排序

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

我尝试合并两个csv字段,消除重复项,排序并将其存储在新字段中

我能够做到这一点。然而,我遇到了一个场景,其中的值类似于abc和abc*。我需要把一个和abc*一起保留,把另一个拿走。 这是否可以在没有逐行处理的情况下实现

这是我的

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*

不要。阅读,你会看到很多原因,为什么这个问题的答案绝对是肯定的!你需要规范化你的数据库,以摆脱这种暴行。同意。新的设计考虑了规范化。然而,在那之前,我们一直被困在这一点上。所以,我只是想在这方面帮助一位同事和我自己学习一些棘手的事情。