【发布时间】:2019-06-01 14:55:52
【问题描述】:
我正在尝试通过首先转换我正在成功执行的“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 表连接到供应商名称上的供应商表时,
;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 哪个版本?
-
Sql Server 2014
-
为什么还要在列中存储逗号分隔值?相反,您应该构建一个适当的规范化关系数据模型,这样一开始就不会发生此类问题。
-
它是一个继承的数据库。如果我按照自己的方式行事,我不会使用它,但值班电话
-
@Chesaro 您可以查看以下链接,了解可在 sql server 2014 中使用的许多字符串拆分用户功能:stackoverflow.com/questions/10914576/t-sql-split-string
标签: c# sql sql-server tsql sql-server-2014