-1

現在、C#で記述した現在のデータインポートプロセスをアップグレードしています。

アップグレードプロセスの一環として、リライトからのインポートプロセスの結果を古いシステムの結果と照合する必要があります。

行った変更の1つは、コンマ区切りのリストを別のテーブルの行に分割することでした。これにより、単純な結合を使用して結果をフィルタリングできるようになります。

これは古いスキーマです:

FormNumber      MainCategories
1               blue,green,red
2               yellow,red,blue
3               white

正規化したもの:

FormNumber      AttributeId      Value
1               1                blue
1               1                green
1               1                red
2               1                yellow
2               1                red
2               1                blue
3               1                white

次のステップは、2つのプロセスの結果が同じであることを確認することです。これらのチェックの1つは、古いプロセスのMainCategoriesフィールドを、正規化されたテーブルの結果と比較することです。

これは、最後に、質問につながります。古いスキーマの値と比較するために、新しいスキーマのコンマ区切りのリストを作成するにはどうすればよいですか。

ここで@Riteshによって提案されたXMLPathソリューションを試しました:多くの行を単一のテキスト文字列に連結しますか?

適合したSQLステートメントは次のとおりです。

Select distinct ST2.FormNumber, 
           (Select ST1.Value + ',' AS [text()]
            From cache.ArtifactAttribute ST1
            Where ST1.FormNumber= ST2.FormNumber
            ORDER BY ST1.FormNumber
            For XML PATH ('')) [Values]
     From cache.ArtifactAttribute ST2

問題は、結果が正しくないことです。FormNumber 1のテーブルには3つのエントリしかありませんが、[値]列(動的に作成された区切り文字列)には誤った結果が表示されます。明らかに、SQLコードを正しく実装していません。

何が間違っているのですか?

4

2 に答える 2

1

これは私にとってはうまくいくようです:

DECLARE @s TABLE(FormNumber int, AttributeId int, Value varchar(32));

INSERT @s VALUES
(1,1,'blue'),
(1,1,'green'),
(1,1,'red'),
(2,1,'yellow'),
(2,1,'red'),
(2,1,'blue'),
(3,1,'white');

SELECT ST2.FormNumber, [Values] = STUFF(
      (SELECT ',' + ST1.Value AS [text()]
         FROM @s ST1
         WHERE ST1.FormNumber = ST2.FormNumber
         ORDER BY ST1.FormNumber
         FOR XML PATH (''),
         TYPE).value(N'./text()[1]', N'varchar(max)'), 1, 1, '')         
FROM @s ST2 GROUP BY ST2.FormNumber;

結果:

FormNumber
1 青、緑、赤
2 黄、赤、青
3 白い
于 2012-08-31T17:33:33.007 に答える
1

試す方法は次のとおりです。

SELECT DISTINCT A.FormNumber, MainCategories
FROM YourTable A
CROSS APPLY (SELECT STUFF((SELECT ',' + Value 
                           FROM YourTable
                           WHERE FormNumber = A.FormNumber FOR XML PATH('')),1,1,'') MainCategories) B

連結されたアイテムの順序が実際に同じであるかどうかを実際に確認できないという問題がありますが、その順序を明示的に示す列がないためです。これは、この例で機能するSQLフィドルです。

于 2012-08-31T17:35:10.993 に答える