在 SQL 中连接 string_split 值

问题描述

美好的一天,

我目前正在处理一个有点混乱的 sql 查询,我不知道如何完成我需要的最后一步。基本结构基于 3 个表:

  1. dbo.csv_export_160_Gewindefahrwerke 主数据表
  2. dbo.TecDoc 带有附加信息的表,用 INNER JOIN
  3. 连接
  4. dbo.KW Hinweise 包含需要添加到主数据表的 ìdentifier 列的表

到目前为止一切顺利,除了添加了第三张桌子。包含要联接的数据的列是第一个表 (dbo.csv_export_160_Gewindefahrwerke) 内的逗号分隔值,但行与行不同。像这样:

  1. 5,13,​​47,64
  2. 1,10,50,55,74,88
  3. 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 查看它的实际效果。