SQL Serverのステージング領域に存在する区切りフィールドにデータを含むデータソースがあります。私はこのデータを多くの行に変換して作業しやすいようにしたいと思います。これは、この区切られたデータが存在する複数のフィールドがあるという点で、同様のトピックに関する他の多くの質問と回答とは異なります。ここに私のデータがどのように見えるかの例です:複数の区切りフィールドをSQL Serverの行に変換する
ID | Field | Value
---+-------+------
1 | a,b,c | 1,2,3
2 | a,c | 5,2
は、そして、これは、所望の出力です:
ID | Field | Value
---+-------+------
1 | a | 1
1 | b | 2
1 | c | 3
2 | a | 5
2 | c | 2
私のコードは、これまで使用しています、ここで述べたようなXML構文解析方法:Turning a Comma Separated string into individual rows私が必要これを拡張して各フィールドを、それぞれのIDのrow_numberを生成し、IDとこのrow_numberに基づいて一致させて対応する値に結合します。
私の問題は、それは痛みを伴いますので、誰かがもっとパフォーマンスの良い方法を持っているのだろうかと疑問に思っています。
select
[Value].ID, [Field], [Value]
from
(select
A.ID, Split.a.value('.', 'varchar(100)') as [Value],
row_number() over (partition by ID order by Split.a) as RowNumber
from
(select
ID, cast('<M>' + replace([Value], ',', '</M><M>') + '</M>' as xml) as [Value]
from
#source_table
where
[Field] not like '%[<>&%]%' and [Value] not like '%[<>&%]%') as A
cross apply
[Value].nodes ('/M') as Split(a)
) [Value]
inner join
(
select
A.ID, Split.a.value('.', 'varchar(100)') as [Field],
row_number() over (partition by A.ID order by Split.a) as RowNumber
from
(select
ID, cast('<M>' + replace([Field], ',', '</M><M>') + '</M>' as xml) as [Field]
from
#source_table
where
[Field] not like '%[<>&%]%' and [Value] not like '%[<>&%]%') as A
cross apply
[Field].nodes ('/M') as Split(a)
) [Field] on [Value].ID = [Field].ID and [Value].RowNumber = [Field].RowNumber
フムを...あなたのソリューションは、ビットバギーのようだ:それはIDを返しますが、フィールドにも値でもありません...あなたが最初の反復でNULLを選択し、次にNULLの部分文字列を選択したために、最も確かに... – Tyron78
パーフェクト。同様に動作するバージョンを追加しました。 – Tyron78