使用递归CTE通过条件检查将多行连接为单行

Sairam62cse
CREATE TABLE table1
(
     num INT,
     val VARCHAR(100)
);

INSERT INTO table1
VALUES (1, 'test1'), (2, 'test2'), (1, 'test3'), (1, 'test4')

CREATE TABLE table2
(
     num           INT,
     concatenation VARCHAR(1000)
)  

INSERT INTO table2
SELECT num,
       Substring((SELECT DISTINCT ',' + T2.val
                  FROM   table1 T2
                  WHERE  T1.num = T2.num
                  FOR XML PATH('')), 2, 1000000)
FROM   table1 T1
GROUP  BY num  

现在,我使用查询更新了第一条记录

UPDATE table2
SET    concatenation = 'test1,test25,test4'
WHERE  num = 1  

现在,在 table1

INSERT INTO table1(num,val)
VALUES (3,'test5'),(1,'test6')(1,'test1')  

现在,我想table2使用没有重复的更新行来更新记录。在这里,我想连接文本是否不存在,并避免是否存在重复项。

预期结果:我对table2结果的更新应获得预期结果,如下所示

select * from table2

输出:

Num concatenation
-----------------------------------
1   test1,test25,test3,test4,test6
2   test2
3   test5

您可以一击:

;WITH SplitTable2
AS
(
    SELECT 
        A.*,
        O.splitdata 
    FROM
     (SELECT *,  cast('<X>'+replace(F.concatenation,',','</X><X>')+'</X>' as XML) as xmlfilter from @table2 F) A
     CROSS APPLY ( SELECT fdata.D.value('.','varchar(50)') as splitdata FROM A.xmlfilter.nodes('X') as fdata(D)) O 
), ResultList
AS
(
    SELECT S.num, S.splitdata AS val FROM SplitTable2 S
    UNION
    SELECT T.num, T.val FROM @table1 T
), Result
AS
(
    SELECT DISTINCT
        R.num,      
        STUFF((SELECT ',' + T2.val FROM ResultList T2 WHERE T2.num = R.num FOR XML PATH('')), 1, 1, '') val
    FROM
        ResultList R
)

SELECT * FROM Result

结果:

num         val                               
----------- ----------------------------------
1           test1,test25,test3,test4,test6
2           test2
3           test5

评论的答案

;WITH PrepareVal
AS
(
    SELECT 
        T1.num ,
        T1.val
    FROM
       @table1 T1
    WHERE
        NOT EXISTS
        (
            SELECT 1 FROM @table2 T2
            WHERE
                T2.num = T1.num AND 
                ',' +  T2.concatenation + ',' LIKE '%,' + T1.val + ',%'
        )

), ResultList
AS
(
    SELECT DISTINCT
        R.num,      
        STUFF((SELECT ',' + T2.val FROM PrepareVal T2 WHERE T2.num = R.num FOR XML PATH('')), 1, 1, '') val
    FROM
        PrepareVal R
), Result
AS
(
    SELECT 
        T2.num ,
        T2.concatenation + CASE WHEN R.val IS NOT NULL THEN ',' + R.val ELSE '' END AS concatenation    
    FROM    
        @table2 T2 LEFT JOIN 
        ResultList R ON T2.num = R.num

    UNION ALL

    SELECT 
        R.num ,
         R.val AS concatenation     
    FROM            
        ResultList R LEFT JOIN 
        @table2 T2 ON T2.num = R.num
    WHERE
        T2.num IS NULL 
)

SELECT * FROM Result

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将单行扩展为多行

来自分类Dev

将单行扩展为多行

来自分类Dev

使用多表子句将多行值选择为单行

来自分类Dev

将单列连接为单行

来自分类Dev

Bash:将多行解析为单行命令

来自分类Dev

将多行分组为单行sql

来自分类Dev

Win Batch,将单行分隔为多行

来自分类Dev

如何以有序的不同值将多行连接为单行?

来自分类Dev

熊猫:通过删除多索引数据框中的NaN将多行折叠为单行

来自分类Dev

使用SED将多行转换为单行

来自分类Dev

使用字符串分隔符将多行打印为单行

来自分类Dev

将连接与 CTE 结合使用

来自分类Dev

根据某些条件,无法将多行合并为单行

来自分类Dev

按条件将多行数据转换为单行

来自分类Dev

如何通过R中的ID将多行转换为单行

来自分类Dev

通过Postgresql中的列将单行转换为多行

来自分类Dev

shell_exec将多行输出显示为单行

来自分类Dev

SQL Server-将多行中的列显示为单行

来自分类Dev

SQL Server-将多行中的列显示为单行

来自分类Dev

将单行拆分为多行,直到匹配为特定模式

来自分类Dev

根据过滤器将单行扩展为多行

来自分类Dev

如何将 SQL Server 中的单行“扩展”为多行?

来自分类Dev

将多行多列公式输出压缩为单行

来自分类Dev

SQL将多行查询为具有JOIN的单行

来自分类Dev

通过分组将多行连接为单个文本字符串

来自分类Dev

使用熊猫根据键变量将多行转换为单行

来自分类Dev

如何使用熊猫将多行合并为单行

来自分类Dev

如何使用MySql将多行查询到单行?

来自分类Dev

使用地图将多行语句转换为单行