【问题标题】:Comma separated values join to master table逗号分隔值连接到主表
【发布时间】:2017-03-30 02:24:11
【问题描述】:

我想在来自其他表的数据包含两行或更多行并且使用“用于 xml 路径”时显示数据,但在使用“用于 xml 路径”时始终为空。请立即查看我的示例表和我的 sql 查询。

TCPAR :
IdCPAR | IdReferensi 
1        '1','2'
2        '1','3','4'

TReferensi :
IdReferensi | Referensi
1              Alfa
2              Beta 
3              Carlie
4              Delta

i want result like this:
IdCpar | IdReferensi | ReferensiName
1         '1','2'      'Alfa','Beta'

这是我的 sql 查询:

select
a.idCpar,
a.IdReferensi,
(
    SELECT LEFT(result, Len(result) - 1) FROM(SELECT '''' + Referensi + ''',' FROM TReferensi (NOLOCK) 
    WHERE IdReferensi IN (a.IdReferensi)
    ORDER  BY Referensi FOR XML PATH ('')) x (result)
)as ReferensiName
from TCPAR as a
where a.IdCPAR=1

and the result:
idCpar | IdReferensi | ReferensiName
1          '1','2'     NULL

请帮助我...谢谢...

【问题讨论】:

  • IN 不会读取字符串并且知道您正在寻找单独的值 - 它会将其视为单个字符串。您可用的解决方案是(a)规范化您的表(您应该这样做,而不是在列中保留逗号分隔值)并更改您的查询,(b)将您的 IN 更改为 LIKE(例如 WHERE ',' + a.IdReferensi + ',' LIKE '%,''' + IdRefensi + ''',%' ) 或 (c) 使您的查询动态化(比需要的更复杂)。

标签: sql-server subquery for-xml-path


【解决方案1】:

试试这个

select
a.idCpar,
a.IdReferensi,
STUFF(
   (SELECT CONCAT(',''', Referensi , '''') FROM TReferensi (NOLOCK) 
   WHERE a.IdReferensi LIKE CONCAT('%''',IdReferensi,'''%')
   ORDER  BY Referensi FOR XML PATH ('') )
,1,1,'') as ReferensiName
from TCPAR as a
where a.IdCPAR=1

【讨论】:

    【解决方案2】:
    CREATE TABLE TReferensi
        ([IdReferensi] int, [Referensi] varchar(6))
    ;
    
    
    INSERT INTO TReferensi
        ([IdReferensi], [Referensi])
    VALUES
        (1, 'Alfa'),
        (2, 'Beta'),
        (3, 'Carlie'),
        (4, 'Delta')
    ;
    
    CREATE TABLE TCPAR
        ([IdCPAR] int, [IdReferensi] varchar(100))
    ;
    
    INSERT INTO TCPAR
        ([IdCPAR], [IdReferensi])
    VALUES
        (1, '''1'',''2'''),
        (2, '''1'',''3'',''4''')
    ;
    
    
    
    ;with cte as
    (
        select
            t1.IdCPAR, t2.IdReferensi
        from
        (
            select
                IdCPAR, 
                IdReferensi = cast(cast(t2.c.query('data(.)') as varchar) as int)
            from
            (
                select 
                    IdCPAR,
                    ReferensiXml = cast('<root><a>' + replace(REPLACE(IdReferensi,'''',''), ',', '</a><a>') + '</a></root>' as xml)
                from TCPAR
            ) t1
            cross apply ReferensiXml.nodes('/root/a') t2(c)
        ) t1
        join TReferensi t2 on t1.IdReferensi = t2.IdReferensi
    )
    
    
    
    SELECT T2.IdCPAR,T3.IdReferensi,
            STUFF((SELECT ','''+Referensi+''''
            FROM (
                    select 
                        t1.IdCPAR,t2.Referensi
                    from cte t1
                    INNER JOIN TReferensi t2 
                    ON  t2.IdReferensi = t1.IdReferensi 
                 )T1
            WHERE T2.IdCPAR = T1.IdCPAR
            FOR XML PATH('')),1,1,'') AS Referensi
    FROM(
        select 
            t1.IdCPAR,t2.Referensi
        from cte t1
        INNER JOIN TReferensi t2 
        ON  t2.IdReferensi = t1.IdReferensi 
     )T2
    INNER JOIN TCPAR T3
     ON T3.IdCPAR = T2.IdCPAR
    GROUP BY T2.IdCPAR,T3.IdReferensi
    

    Demo

    【讨论】:

    • @achmaddarmawan 很高兴为您提供帮助。 :)
    猜你喜欢
    • 2023-03-11
    • 2010-11-06
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多