SQL Server和带有两个表的STUFF

时间:2018-07-13 17:05:49

标签: sql sql-server

我遇到了问题。我有两个表,如下所示。

表1

+----+------+  
| ks | keys |  
+----+------+  
|  11 | 1122|  
+----+------+  
|  12 | 2211|  
+----+------+  
|  13 | 2233|  
+----+------+  
|  14 | 3322|  
+----+------+

表2

+----+--+-------+  
| Id | ks|codes|                 
+----+-----------+  
|  1 | 11  |aaaaa|  
+----+-----------+  
|  2 | 11  |bbbbb|  
+----+-----------+  
|  3 | 12  |aaaaa|  
+----+-----------+  
|  3 | 13  |ccccc|  
+----+-----------+  
|  4 | 12  |bbbbb|  
+----+-----------+

我试图实现以下查询以获取所需的输出,但没有成功:

SELECT ks,
        STUFF (
                (SELECT ', ' + t2.codes as [text()]
                        from table2 as t2 where t1.ks = t2.ks FOR XML PATH('')
                ),1,1,'' 
               ) as "codes" 
from table1 t1
group by ks;

我得到此表作为结果:

+----+------+  
| ks | codes|  
+----+------+  
| 11 | aaaa |  
+----+------+  
| 11 | bbbb |  
+----+------+  
| 12 | cccc |  
+----+------+  
| 12 | dddd |  
+----+------+

然后下图显示了我所需的输出: required result

我做错了什么,但我不知道会发生什么。有机会有人帮我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

尝试一下。我认为您发布了错误的输出。

Create table #tbl (ks int , codes varchar(10))  
Insert into #tbl values
 (11 ,'aaaa'),  
 (12 ,'bbbb'),  
 (13 ,'cccc'),  
 (14 ,'dddd')

Create table #tbl2 (id int, ks int , codes varchar(10))  
Insert into #tbl2 values
( 1 ,11 ,'aaaaa'),  
( 2 ,11 ,'bbbbb'),  
( 3 ,12 ,'aaaaa'),   
( 3 ,13 ,'ccccc'),   
( 4 ,12 ,'bbbbb')

with cte as
(Select t1.ks, t2.codes 
from #tbl t1 join #tbl2 t2 on t1.ks = t2.ks)
Select ks, STUFF(
                 (SELECT ',' + codes FROM cte c1 
                  where c1.ks = c2.ks FOR XML PATH ('')), 1, 1, ''
                ) 
from cte c2 
group by ks

输出:

ks
11  aaaaa,bbbbb
12  aaaaa,bbbbb
13  ccccc

答案 1 :(得分:0)

我不能说我完全理解表中发生的事情-特别是考虑到您的输出图像似乎与示例表没有关系-但是您似乎希望用逗号分隔的子值列表来自与table1关联的table2。

这是一个有效的示例,我认为它可以解决您的需求。在这些情况下,您可以使用CROSS APPLY。这样做使您可以从表1返回所有值,而不管表2中的记录是否匹配。

DECLARE @table1 TABLE ( [ks] INT, [code] VARCHAR(10) );
DECLARE @table2 TABLE ( [id] INT, [ks] INT, [code] VARCHAR(10) );

    -- populate table1 --
    INSERT INTO @table1 (
        [ks], [code]
    ) 
    VALUES
    ( 11, 'aaaa' )
    , ( 12, 'bbbb' )
    , ( 13, 'cccc' )
    , ( 14, 'dddd' );

    -- populate table two --
    INSERT INTO @table2 (
        [id], [ks], [code]
    )
    VALUES
    ( 1, 11, 'aaaaa' )
    , ( 2, 11, 'bbbbb' )
    , ( 3, 12, 'aaaaa' )
    , ( 3, 13, 'ccccc' )
    , ( 4, 12, 'bbbbb' );


    SELECT
        t1.ks, codes.codes
    FROM @table1 t1
    CROSS APPLY (

        SELECT (
            STUFF(
                ( SELECT ', ' + t2.code AS "text()" FROM @table2 t2 WHERE t2.ks = t1.ks FOR XML PATH ( '' ) )
                , 1, 2, ''
            )
        ) AS [codes]

    ) AS codes
    ORDER BY
        t1.ks;

结果输出:

ks  codes
11  aaaaa, bbbbb
12  aaaaa, bbbbb
13  ccccc
14  NULL