首页 > 解决方案 > 使用 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-serverstringtsqlinner-joinunnest

解决方案


您需要横向连接来取消嵌套字符串 - 在 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

DB Fiddle 上的演示

编号 | p_name | d_name
-: | :----- | :-----
 1 | 多多| dep10
 1 | 多多| dep11
 1 | 多多| dep12
 2 | 塔塔 | dep9  

推荐阅读