alv*_*aro 6 c# sql t-sql sql-server sql-server-2014
我试图通过首先从我正在成功执行的"SupplierId"列转换逗号分隔值来加入两个表.但是,当我尝试通过外键"DCLink"连接到具有供应商名称的另一个表"供应商"时,问题就出现了.
这就是我的意思:
原始表的select语句,
SELECT InquiryId, SupplierId FROM Procure_InquiryDetails
Run Code Online (Sandbox Code Playgroud)
给出了这个结果
InquiryId SupplierId
1 2,3
2 175
3 170,280
5
7 12
8 5,9
Run Code Online (Sandbox Code Playgroud)
我可以使用此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)
Run Code Online (Sandbox Code Playgroud)
并获得这些结果
InquiryId SupplierId
1 2
1 3
2 175
3 170
3 280
5
7 12
8 5
8 9
Run Code Online (Sandbox Code Playgroud)
当我应用这段代码将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)
Run Code Online (Sandbox Code Playgroud)
它给了我这个非常不方便的结果:
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
Run Code Online (Sandbox Code Playgroud)
我希望join语句显示和流动为原始select语句.
我被困住了,我似乎无法弄清楚我哪里出错了.任何正确方向的指针?
你忘了提供预期的结果,所以这是一个黑暗的刺,然而,分裂你的字符串和使用结果的一个错误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;
Run Code Online (Sandbox Code Playgroud)
但是,理想情况下,您不应该在RDBMS中存储分隔数据.考虑切换到适当的规范化多对多关系结构.
如果你还在SQL Server 2008上(我强烈建议你升级),那么你可以使用delimitedsplit8k,或者在2012/2014你可以使用delimitedsplit8k_lead.
假设您使用的是 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |