2017-06-07 62 views
0

需要建議將表1中的字符串拆分,並將其ID與表2匹配並連接值。SQL - 基於ID的字符串組合

表 - 1

Id Tbl1Col 
1 2 
2 2,4 
3 
4 6 
5 3 

表 - 2

Id Tbl2Col 
1 E 
2 F 
3 M 
4 U 
5 P 
6 C 
7 N 
8 G 

查詢 -

SELECT T2.Tbl2Col 
FROM Table1 AS T1 
LEFT JOIN Table2 AS T2 WHERE T1.Tbl1Col= T2.Id 
WHERE T1.Id = @Id 

現在如果@Id = 1,輸出爲F - 工作正常

現在如果@Id = 2,輸出應該是FU - 不應該是F,U

+0

您需要一個ON子句,放置連接條件。 – jarlh

+1

您不應該**將逗號分隔值存儲在數據庫中 –

+1

也應該添加預期結果。 (格式化文本也在這裏。) – jarlh

回答

1

Yuck!但是你可以使用LIKE

SELECT T2.Tbl2Col 
FROM Table1 T1 LEFT JOIN 
    Table2 T2 
    WHERE ',' + T1.Tbl1Col + ',' LIKE '%,' + CAST(T2.Id as VARCHAR(255)) + ',%' 
WHERE T1.Id = @Id; 

你有一個糟糕的數據格式,所以這不能利用索引。你應該真的有一個單獨的表,每Table1.idTable2.id一行。這樣的表被稱爲聯結表或關聯表。

+0

我明白規範化,必須使用這種數據格式。讓我測試一下。 – Sajal

+0

不得不'選擇@Codes = concat(@codes + T2.Tbl2Col)'來獲得想要的結果作爲'FU'而不是多行。儘管如此,像一個魅力工作! – Sajal

0
create table dbo.Table01 (
Id int 
, Col varchar(100) 
); 

create table dbo.Table02 (
Id int 
, Col varchar(100) 
); 

insert into dbo.Table01 (Id, Col) 
values (1, '2'), (2, '2, 4'); 

insert into dbo.Table02 (Id, Col) 
values (1, 'E'), (2, 'F'), (4, 'U'); 

select 
t.Id 
, replace(STRING_AGG (t02.Col, ','), ',', '') as StringAgg 
from dbo.Table01 t 
cross apply string_split (t.Col, ',') as ss 
inner join dbo.Table02 t02 on ss.value = t02.Id 
group by t.id 
+0

您的代碼無法使用! **消息195,級別15,狀態10,行19 'STRING_AGG'不是公認的內置函數名稱。** –

+0

您在哪個SQL Server版本上? –

+0

您的代碼只能在SQL Server 2017中工作。 –

1

按照下一方法: -

1)通過使用CROSS APPLY打開一個逗號分隔字符串轉換成各行與XML

2)左連接加入兩個表。

3)經由使用STUFF & FOR XML

4)使用用於去除逗號替換功能連接具有相同的id許多行。

演示: -

declare @MyTable table (id int , Tbl1Col varchar(10)) 
insert into @MyTable values (1,'2'),(2,'2,4'),(3,''),(4,'6'),(5,'3') 

declare @MyTable2 table (id int , Tbl2Col varchar(10)) 
insert into @MyTable2 values (1,'E'),(2,'F'),(3,'M'),(4,'U'),(5,'P'),(6,'C'),(7,'N'),(8,'G') 


select a.id , Tbl2Col 
into #TestTable 
from 
(

SELECT A.id, 
    Split.a.value('.', 'VARCHAR(100)') AS Tbl1Col 
FROM 
(
    SELECT id, 
     CAST ('<M>' + REPLACE(Tbl1Col, ',', '</M><M>') + '</M>' AS XML) AS Data 
    FROM @MyTable 
) AS A CROSS APPLY Data.nodes ('/M') AS Split(a)) a 

left join @MyTable2 b 
on a.Tbl1Col = b.id 

order by a.id 



SELECT id, Tbl2Col = 
    Replace(STUFF((SELECT DISTINCT ', ' + Tbl2Col 
      FROM #TestTable b 
      WHERE b.id = a.id 
      FOR XML PATH('')), 1, 2, ''),',','') 
FROM #TestTable a 
GROUP BY id 

輸出: -

1 F 
2 F U 
3 NULL 
4 C 
5 M 

參考: -

Turning a Comma Separated string into individual rows

How to concatenate many rows with same id in sql?


最後: -

不要使用這種方法,而你的正常化,而不是數據庫,只是把它當作好玩/培訓/試圖....等代碼。

+0

表是由其他開發人員幾年前創建的,我無法改變它們,因爲依賴關係。我也會測試你的解決方案,看起來很有趣! – Sajal