2

200,000以上のレコードのsqlserverテーブルで、他の列によってグループ化されたいくつかの列データのより高速な連結について支援が必要です。たとえば、サンプルデータと期待される結果を以下に示します

ColumnA, ColumnB, ColumnCここでは、次のような4つの組み合わせのために、最後の列をパイプ区切りの文字列として連結する必要があります。

where KeyNumber=@strKeyNumber  and  Action=@strAction  and  Type=@strType  and  Code=@strCode

これらの4つは明確な組み合わせです。

t-sql STUFF関数を使用してこれをコーディングしましたが、遅すぎます。また、whileループで別の方法でコーディングしましたが、それでも遅すぎます。

だから私はより速い結果を得るのに助けが必要です。

これらの列A、B、Cのデータは長い文字列であるため、連結された文字列はタイプがである必要がありnvarchar(max)ます。

テーブル内の元のデータ(一部の列に重複がある場合があります):

ID  KeyNumber   Action  Type    Code    ColumnA     ColumnB     ColumnC  
1   1111111111  AC1     TYPE1   CODE1   ValueA1     ValueB1     ValueC1 
2   1111111111  AC1     TYPE1   CODE1   ValueA2     ValueB2     ValueC2 
3   1111111111  AC1     TYPE1   CODE1   ValueA2     ValueB2     ValueC3 
4   1111111111  AC1     TYPE1   CODE1   ValueA3     ValueB3     ValueC4
5   2222222222  AC2     TYPE2   CODE2   ValA1       ValB1       ValC1   
6   2222222222  AC2     TYPE2   CODE2   ValA2       ValB2       ValC2
7   2222222222  AC2     TYPE2   CODE2   ValA3       ValB3       ValC3
8   2222222222  AC2     TYPE2   CODE2   ValA4       ValB4       ValC4
9   2222222222  AC2     TYPE2   CODE2   ValA4       ValB5       ValC4   

以下のような新しいテーブルに結果データが必要です(上記のテーブルの重複する値はここで繰り返さないでください):

ID  KeyNumber   Action  Type    Code    ColumnA                 ColumnB                         ColumnC  
1   1111111111  AC1     TYPE1   CODE1   ValueA1|ValueA2|ValueA3 ValueB1|ValueB2|ValueB3         ValueC1|ValueC2|ValueC3|ValueC4 
2   2222222222  AC2     TYPE2   CODE2   ValA1|ValA2|ValA3|ValA4 ValB1|ValB2|ValB3|ValB4|ValB5   ValC1|ValC2|ValC3|ValC4 
4

2 に答える 2

2

あなたはこれをチェックすることができます:

DECLARE @Table TABLE
(
    ID BIGINT,
    Keynumber BIGINT,
    [Action] CHAR(3),
    [Type] CHAR(5),
    Code CHAR(5),
    ColumnA NVARCHAR(MAX),
    ColumnB NVARCHAR(MAX),
    ColumnC NVARCHAR(MAX)
)

INSERT INTO @TABLE(ID,Keynumber,[Action],[Type],Code,ColumnA,ColumnB,ColumnC)
VALUES   (1,1111111111,'AC1','TYPE1','CODE1','ValueA1','ValueB1','ValueC1') 
        ,(2,1111111111,'AC1','TYPE1','CODE1','ValueA2','ValueB2','ValueC2')
        ,(3,1111111111,'AC1','TYPE1','CODE1','ValueA2','ValueB2','ValueC3')
        ,(4,1111111111,'AC1','TYPE1','CODE1','ValueA3','ValueB3','ValueC4')
        ,(5,2222222222,'AC2','TYPE2','CODE2','ValA1','ValB1','ValC1')
        ,(6,2222222222,'AC2','TYPE2','CODE2','ValA2','ValB2','ValC2')
        ,(7,2222222222,'AC2','TYPE2','CODE2','ValA3','ValB3','ValC3')
        ,(8,2222222222,'AC2','TYPE2','CODE2','ValA4','ValB4','ValC4')
        ,(9,2222222222,'AC2','TYPE2','CODE2','ValA4','ValB5','ValC4')

SELECT   Keynumber
        ,[Action]
        ,[Type]
        ,Code
        ,(
             SELECT  ColumnA AS [text()]
             FROM    @Table TableOne
             WHERE    TableOne.Keynumber = TableTwo.Keynumber and  TableOne.[Action] = TableTwo.[Action] and  TableOne.[Type] = TableTwo.[Type]
             ORDER BY TableOne.ColumnA
             FOR XML PATH(''), TYPE
        ).value('/', 'NVARCHAR(MAX)') AS ColumnA
        ,(
             SELECT  ColumnB AS [text()]
             FROM     @Table TableOne
             WHERE    TableOne.Keynumber = TableTwo.Keynumber and  TableOne.[Action] = TableTwo.[Action] and  TableOne.[Type] = TableTwo.[Type]
             ORDER BY TableOne.ColumnB
             FOR XML PATH(''), TYPE
        ).value('/', 'NVARCHAR(MAX)') AS ColumnB
        ,(
            SELECT   ColumnC AS [text()]
            FROM     @Table TableOne
            WHERE    TableOne.Keynumber = TableTwo.Keynumber and  TableOne.[Action] = TableTwo.[Action] and  TableOne.[Type] = TableTwo.[Type]
            ORDER BY TableOne.ColumnC
            FOR XML PATH(''), TYPE
        ).value('/', 'NVARCHAR(MAX)') AS ColumnC

FROM(
        SELECT  DISTINCT Keynumber,[Action],[Type],Code
        FROM    @Table
    ) TableTwo

また、使用している文字列連結の方法がわかりません。このサイトで他のテクニックを確認できます。

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

于 2012-09-01T22:15:48.393 に答える
1

CodePlexには、ユーザー定義の集計GROUP_CONCATのオープンソースCLR実装があることをご存知ですか。インストールは、サーバーでSQLスクリプトを実行するのと同じくらい簡単です。

http://groupconcat.codeplex.com/

4つのgroup_concat実装があり、yesはNVARCHAR(MAX)を返します

  • GROUP_CONCAT --デフォルトの区切り文字は、(コンマ)

  • GROUP_CONCAT_D-区切り文字を指定できます

  • GROUP_CONCAT_DS-区切り文字、並べ替え順序を指定できます(1は昇順、2は降順)

  • GROUP_CONCAT_S-並べ替え順序を指定できます

    そして、これはパフォーマンスの面で非常に良いと思います。

ここに画像の説明を入力してください

あなたの例では、このように使用します

SELECT   Keynumber
    ,[Action]
    ,[Type]
    ,Code
    ,dbo.GROUP_CONCAT_DS(ColumnA,'|',1) AS ColumnA
    ,dbo.GROUP_CONCAT_DS(ColumnB,'|',1) AS ColumnB
    ,dbo.GROUP_CONCAT_DS(ColumnC,'|',1) AS ColumnC 
FROM YourTable
GROUP BY
     Keynumber
    ,[Action]
    ,[Type]
    ,Code
于 2012-09-02T03:40:17.193 に答える