如何将逗号分隔的列值与另一个表作为行结合起来

时间:2019-01-06 21:11:39

标签: c# sql sql-server tsql sql-server-2014

我试图通过首先转换成功完成的“ SupplierId”列中的逗号分隔值来连接两个表。 但是,当我尝试通过外键“ DCLink”使用供应商名称连接到另一个表“供应商”时,就会出现问题。

这是我的意思:

原始表的选择语句,

  SELECT  InquiryId, SupplierId FROM Procure_InquiryDetails

给出此结果

InquiryId   SupplierId

1           2,3
2           175
3           170,280
5           
7           12
8           5,9

我可以使用此sql语句从SupplierId中拆分列

;WITH CTE
    AS
    (
        SELECT  InquiryId,
                [xml_val] = CAST('<t>' + REPLACE(SupplierId,',','</t><t>') + '</t>' AS XML)
        FROM Procure_InquiryDetails
    )

SELECT  InquiryId,
        [SupplierId] = col.value('.','VARCHAR(100)')
FROM CTE
CROSS APPLY [xml_val].nodes('/t') CA(col) 

并获得这些结果

InquiryId   SupplierId
    1           2
    1           3
    2           175
    3           170
    3           280
    5   
    7           12
    8           5
    8           9 

但是,当我应用这段代码将InquiryDetails表连接到供应商名称上的Vendor表时,

;WITH CTE
AS
(
    SELECT  InquiryId,
            [xml_val] = CAST('<t>' + REPLACE(SupplierId,',','</t><t>') + '</t>' AS XML),
            Vendor.Name
    FROM Procure_InquiryDetails inner join Vendor
    on ',' + Procure_InquiryDetails.SupplierId + ',' like '%,' + cast(Vendor.DCLink as nvarchar(20)) + ',%'
)

SELECT  InquiryId, Name,
        [SupplierId] = col.value('.','VARCHAR(100)')
FROM CTE
CROSS APPLY [xml_val].nodes('/t') CA(col)

这给我带来了非常不便的结果:

InquiryId   Name                                                                                                                                                   SupplierId
----------- ------------------------------------------------------------------------------------------------------------------------------------------------------ ----------------------------------------------------------------------------------------------------
1           Accesskenya Group Ltd                                                                                                                                  2
1           Accesskenya Group Ltd                                                                                                                                  3
1           Aquisana Ltd                                                                                                                                           2
1           Aquisana Ltd                                                                                                                                           3
2           TOYOTA KENYA                                                                                                                                           175
3           Institute of Chartered Shipbrokers ICS-USD                                                                                                             170
3           Institute of Chartered Shipbrokers ICS-USD                                                                                                             280
7           CMA CGM Kenya Ltd                                                                                                                                      12
8           Aon Kenya Insurance Brokers Ltd                                                                                                                        5
8           Aon Kenya Insurance Brokers Ltd                                                                                                                        9
8           Bill investments ltd                                                                                                                                   5
8           Bill investments ltd

我希望join语句能够像原始的select语句一样显示和流动。

我被困住了,似乎无法弄清楚哪里出了问题。 任何指向正确方向的指针?

2 个答案:

答案 0 :(得分:5)

您已经忘记提供期望的结果,因此这是一个黑暗的尝试,但是,拆分字符串并将结果与​​public class Player { public string Name { get; set; } public int Pid { get; set; } public string Model { get; set; } public string Ip { get; set; } public int Gid { get; set; } } 一起使用是怎么回事:

JOIN

但是,理想情况下,不应在RDBMS中存储定界数据。考虑切换到适当的规范化多对多关系结构。

如果您仍然使用SQL Server 2008(强烈建议您升级到SQL Server 2008),则可以使用delimitedsplit8k,或者在2012/2014上可以使用delimitedsplit8k_lead

答案 1 :(得分:2)

假设您使用的是SQL Server 2016,则可以使用string_split()解析CSV列(此外:字段中用逗号分隔的值表示数据模型不佳),而无需诉诸CTE或XML方法。

select I.inquiry_id, sup.value,V.Name
from Procure_InquiryDetails I
CROSS APPLY string_split(I.supplier_value,',') sup
join Vendor v on v.DCLink = sup.value