1

カンマ区切りの値を文字列として格納するフィールドを持つテーブルがあります。別のテーブルの複数の行から、ある行のその文字列にさらに値を追加したいと思います。以下に例を示します。

COALESCE()が機能することを頭に入れて、そのトリックを使用して変数をロードする方法を考えていますが、カーソルを使用して必要なすべての値を収集する必要があると思いますt1の各行、そして私は本当にカーソルを避けたいです。このテーブルのデザインは私が受け継いだ混乱であり、どこでもカーソルを使って処理することで悪化させないようにしたいと思います。

CREATE Table t1(
StringColumn VARCHAR(10)
)

CREATE Table T2(
    TestString VARCHAR(10),
    ConcatString VARCHAR(10)
)

INSERT INTO t1(StringColumn) VALUES('1,2,3')

INSERT INTO T2(TestString,ConcatString) VALUES('2','4')
INSERT INTO T2(TestString,ConcatString) VALUES('2','5')
INSERT INTO T2(TestString,ConcatString) VALUES('2','6')

INSERT INTO t1(StringColumn) VALUES('A,B,C')

INSERT INTO T2(TestString,ConcatString) VALUES('A','D')
INSERT INTO T2(TestString,ConcatString) VALUES('B','E')
INSERT INTO T2(TestString,ConcatString) VALUES('B','F')    

Begin Tran --Commit Rollback
UPDATE t1
Set t1.StringColumn = t1.StringColumn + ',' + t2.ConcatString
FROM t1 
INNER JOIN t2 ON charindex(t2.TestString,t1.StringColumn) <> 0

SELECT * FROM t1

この例によると、結果は次のとおりです。

1,2,3,4

あいうえお

t1の2つの行を次のようにしたいと思います。

1,2,3,4,5,6

A、B、C、D、E、F

ありがとう。何かアドバイスをいただければ幸いです。

4

2 に答える 2

0

ここで行処理を使用してみませんか。値テーブルを使用してから、次の例のようにしばらく使用できます。

DECLARE @T TABLE(Id int identity,Value int)
DECLARE @MinId INT = (SELECT MIN(Id) FROM @T)
DECLARE @MaxId INT = (SELECT MAX(Id) FROM @T)

DECLARE @ResultTable TABLE (Value int)

WHILE(@MinId <= @MaxId)
BEGIN
    INSERT @ResultTable
        SELECT Value
        FROM @T
        WHERE Id = @MinId

        SET @MinId += 1
END

SELECT *
FROM @ResultTable

私はこれがあなたを助けると思います...

于 2013-03-01T07:18:34.990 に答える
0

このソリューションは、カーソルやループを避けたい場合や、少なくとも SQL 2008 を実行している場合に有効です。これは、作成できる関数やカーソルよりも (SQL 2008 以降で) 効率的です。

2008 年 (または 2005 年?) に導入された新しい XML 機能のいくつかを使用したいと考えています。具体的には、クエリで、XML PATH モードを使用して XML 文字列を作成します。すべての結果が 1 つの XML 文字列に詰め込まれたら、複雑な式を作成して目的の結果を返すことができます。msdn からの詳細な説明:

MSDN パス モード

提供されたサンプル テーブルを使用して、次のクエリを試してください。

SELECT
Test_String = T.StringColumn + (SELECT
                            (',' + t2.ConcatString)
                            FROM 
                                T1 t1
                            INNER JOIN T2 t2
                                ON charindex(t2.TestString,t1.StringColumn) <> 0
                            WHERE 
                            t1.StringColumn = t.StringColumn
                            FOR XML PATH( '' ))
FROM
    T1 T

あなたが言ったことすべてに基づいて、私のクエリを変更する必要があるようです. いくつかの追加の結合を行う必要があるかもしれませんし、おそらくクエリの中身をいくつか変更する必要があるかもしれません。お知らせ下さい!

于 2013-03-01T07:43:59.023 に答える