我试图通过首先转换成功完成的“ 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语句一样显示和流动。
我被困住了,似乎无法弄清楚哪里出了问题。 任何指向正确方向的指针?
答案 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