2017-06-07 10 views
0

表1の文字列を分割し、そのIDを表2と一致させて値を連結するための提案が必要です。IDに基づいたSQL - 文字列の結合

表 - 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; 

あなたはお粗末なデータ形式を持っているので、これはインデックスを使用することはできません。実際に別のテーブルがあり、1行はTable1.idTable2.idになります。このようなテーブルは、接合テーブルまたは関連テーブルと呼ばれます。

+0

正規化を理解しており、このデータ形式で作業する必要があります。私はこれを試してみましょう。 – Sajal

+0

'@Codes = concat(@code + 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

次のアプローチは、次のとおりです - XML

2とCROSS APPLYを用い介して、個々の行にカンマ区切り文字列を参照する)

1)参加左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

関連する問題