如何将逗号分隔的列值与另一个表作为行连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将逗号分隔的列值与另一个表作为行连接相关的知识,希望对你有一定的参考价值。

我试图通过首先从我正在成功执行的“SupplierId”列转换逗号分隔值来加入两个表。但是,当我尝试通过外键“DCLink”连接到具有供应商名称的另一个表“供应商”时,问题就出现了。

这就是我的意思:

原始表的select语句,

  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表加入供应商名称上的供应商表时,

;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语句。

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

答案

假设您正在使用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
另一答案

你忘了提供预期的结果,所以这是一个黑暗的刺,然而,分裂你的字符串和使用JOIN的结果有什么问题:

SELECT {Needed Columns}
FROM dbo.Procure_InquiryDetails PID
     CROSS APPLY STRING_SPLIT(PID.SupplierId,',') SS
     JOIN dbo.Vendor V ON SS.[value] = V.SupplierID;

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

如果你仍然在SQL Server 2008(我强烈建议你升级),那么你可以使用delimitedsplit8k,或者在2012/2014你可以使用delimitedsplit8k_lead

以上是关于如何将逗号分隔的列值与另一个表作为行连接的主要内容,如果未能解决你的问题,请参考以下文章

如何获取以逗号分隔的列值

将主表与另一个表中的所有记录进行比较,以得出主表的列值

将包含列表的记录值与 Postgres 中的列值进行比较

当行悬停并且列值与另一行匹配时显示工具提示

如何将表数据连接到一个逗号分隔的列中[重复]

将 DataFrame 列值与另一个 DataFrame 列匹配并计算命中数