sql-server - 使用 string_id 而不是可连接的连接 2 个表
问题描述
我想加入 2 个表,但它们之间没有连接表......我通常使用 STRING_SPLIT 但在这种情况下,我无法弄清楚。也许我只是累了……你能帮帮我吗?
CREATE TABLE ##Provider
(
id INT,
p_name VARCHAR(50),
list_id_dep VARCHAR(250)
)
CREATE TABLE ##Department
(
id INT,
d_name VARCHAR(50)
)
INSERT INTO ##Provider (id, p_name, list_id_dep) VALUES
(1, 'toto', '/10/11/12/'),
(2, 'tata', '/09/');
INSERT INTO ##Department (id, d_name) VALUES
(9, 'dep9')
,(10, 'dep10')
,(11, 'dep11')
,(12, 'dep12');
我想要的是:
id | p_name | d_name
--------------------------
1 | toto | dep10
1 | toto | dep11
1 | toto | dep12
2 | tata | dep09
我试过了 :
select *
from ##Provider p
inner join ##Department d on STRING_SPLIT(p.list_id_dep, '/') = ???
select *
from ##Provider p
inner join STRING_SPLIT(p.list_id_dep, '/') dep ON dep.value = ???
select *
from ##Provider p, ##Department d
where (select value from STRING_SPLIT(p.list_id_dep, '/')) = d.id
select *
from ##Provider p, ##Department d
where d.id in (select value from STRING_SPLIT(p.list_id_dep, '/'))
也许 STRING_SPLIT 不是正确的方法......
谢谢 !
解决方案
您需要横向连接来取消嵌套字符串 - 在 SQL Server 中,这是用cross apply
. 然后,您可以将department
表与常规连接一起使用:
select p.id, p.p_name, d.d_name
from ##provider p
cross apply string_split(p.list_id_dep, '/') x
inner join ##department d on d.id = x.value
编号 | p_name | d_name -: | :----- | :----- 1 | 多多| dep10 1 | 多多| dep11 1 | 多多| dep12 2 | 塔塔 | dep9
推荐阅读
- angular - 调用验证函数后使表单有效的问题
- node.js - 我一直收到此架构未注册的错误。有没有办法解决这个错误?
- azure - 如何在 Azure Function App 中恢复已删除的 WEBSITE_CONTENTSHARE 配置值
- typescript - 一般键入一个接受两个相同类型参数的函数
- c# - 根据 ASP.NET MVC 中的条件选择特定枚举到 EnumDropDownListFor
- python - 通过列中的常见字符串合并多个熊猫数据框
- python - SettingWithCopyWarning 是什么意思?
- r - 在时间戳之前和之后保留特定日期范围
- apache-spark - 创建 Spark 数据帧时的分区数
- c# - .NET Framework 4 库和 .NET Core 2.2 项目