问题描述
美好的一天,
我目前正在处理一个有点混乱的 sql 查询,我不知道如何完成我需要的最后一步。基本结构基于 3 个表:
-
dbo.csv_export_160_Gewindefahrwerke
主数据表 -
dbo.TecDoc
带有附加信息的表,用INNER JOIN
连接
-
dbo.KW Hinweise
包含需要添加到主数据表的ìdentifier
列的表
到目前为止一切顺利,除了添加了第三张桌子。包含要联接的数据的列是第一个表 (dbo.csv_export_160_Gewindefahrwerke
) 内的逗号分隔值,但行与行不同。像这样:
- 5,13,47,64
- 1,10,50,55,74,88
- 7,14,26,30,31,40
这些值需要与第 3 个表 dbo.KW Hinweise
一一连接以获取那些 (dbo.KW Hinweise.Text
) 的文本。
我已经在我的另一个问题中找到了某种解决方案:SQL join on string_split values,但不知道如何实现它,所以它确实有效。有人有想法吗?
另外:这是当前查询以供参考:https://pastebin.pl/view/8b9105ef
使用的程序:MS sql Server Manager Studio
版本:Windows 10 Pro 上的 Microsoft sql Server 2017 (RTM-GDR) (KB4583456) - 14.0.2037.2 (X64) 2020 年 11 月 2 日 19:19:59 版权所有 (C) 2017 Microsoft Corporation Express Edition(64 位) 10.0(内部版本 18363:)
解决方法
应用评论中建议的 string_split()
函数为我提供了以下解决方案。
示例数据
create table csv_export_160_Gewindefahrwerke
(
id nvarchar(1),export nvarchar(200)
);
insert into csv_export_160_Gewindefahrwerke (id,export) values
('A','5,13,47,64'),('B','1,10,50,55,74,88'),('C','7,14,26,30,31,40');
create table TecDoc
(
id nvarchar(1),doc nvarchar(10)
);
insert into TecDoc (id,doc) values
('A','alpha'),'beta'),'gamma');
create table KW_Hinweise
(
identifier int,description nvarchar(10)
);
insert into KW_Hinweise (identifier,description) values
(1,'One'),(5,'Five'),(7,'Seven'),(10,'Ten');
解决方案
select csv.id,csv.export,td.doc,s.value,kw.description
from csv_export_160_Gewindefahrwerke csv
join TecDoc td
on td.id = csv.id
cross apply string_split(csv.export,',') s
left join KW_Hinweise kw -- using left join because I only provide a few sample rows
on kw.identifier = s.value;
结果
id export doc value description
-- ----------------- ----- ----- -----------
A 5,64 alpha 5 Five
A 5,64 alpha 13 null
A 5,64 alpha 47 null
A 5,64 alpha 64 null
B 1,88 beta 1 One
B 1,88 beta 10 Ten
B 1,88 beta 50 null
B 1,88 beta 55 null
B 1,88 beta 74 null
B 1,88 beta 88 null
C 7,40 gamma 7 Seven
C 7,40 gamma 14 null
C 7,40 gamma 26 null
C 7,40 gamma 30 null
C 7,40 gamma 31 null
C 7,40 gamma 40 null
Fiddle 查看它的实际效果。