0

カンマ区切りの文字列のようなもので更新する必要がある一時テーブル変数があります。

declare @clients table (clientid int, hobbylist char(1000))
declare @hobbies table (clientid int, hobbynumber smallint)

insert into @clients values (3, '')
insert into @clients values (5, '')
insert into @clients values (12, '')

insert into @hobbies values (3, 4)
insert into @hobbies values (3, 5)
insert into @hobbies values (3, 7)
insert into @hobbies values (12, 3)
insert into @hobbies values (12, 7)

したがって、@clientsには次のものが含まれます。

clientid     hobbylist
---------------------------
3
5
12

そして@hobbiesには以下が含まれています:

clientid     hobbylist
---------------------------
3            4
3            5
3            7
12           3
12           7

@clientsテーブルを更新して、次のものが含まれるようにする必要があります。

clientid     hobbylist
---------------------------
3            4;;5;;7
5
12           3;;7

私が見つけた最も近いものはこれでした: 複数の行を連結する方法は? しかし、正解としてマークされているものを見て、彼がどのように「1、2、3」を取得しているのか理解できません。

SQL Server 2008 R2 64を使用しています。カーソルを使用してみましたが、速度が遅くなりました(このspにはこの種のものがたくさんあります)。

これを行うための最も効率的な方法は何ですか?

編集:

njkの提案から、私はこれを試しました:

update c
set hobbylist=Stuff((
            Select  ';;' + cast(hobbynumber as char)
            From    @hobbies h
            Where   h.clientid = c.clientid
            For             XML Path('')
    ), 1, 1, '')
from @clients c

エラーは発生しませんでしたが、結果が非​​常に不安定であるため、ここでそれを表示するための適切な方法を見つけることができません。

たとえば、クライアント3の趣味リストは次のようになります。

;4                             ;;5                             ;;7                                                                                                                               

ALMOSTは機能します。スペースがどこから来ているのかわからない。

編集2。

ええと。キャストを使用しています。私は物事をトリミングする必要があります。このソリューションは、私のサーバーで機能します。ClearLogicも機能するかどうかを確認するので、正解としてマークを付けることができます。

4

2 に答える 2

2

どうぞ

       ;WITH CTE AS 
         (SELECT DISTINCT  clientid,hobbylist= STUFF((SELECT ';'+ LTRIM(STR(hobbynumber))
          FROM @hobbies yt
           WHERE yt.clientid = sc.clientid            
         FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '')
         FROM @hobbies AS sc 
         )
         UPDATE a
         SET a.hobbylist=b.hobbylist 
         FROM @clients AS a
         INNER JOIN CTE AS b
         ON a.clientid = b.clientid
于 2012-09-06T00:08:22.653 に答える
0

これを試してください>

update c SET c.hobbylist = e.list  from @clients c inner join 
(select clientid,STUFF((select ';;'+cast(hobbynumber as varchar(10))from @hobbies h where h.clientid = c.clientid for xml path('')),1,2,'') as list
from @hobbies c
group by clientid) e
on c.clientid = e.clientid 

select * from @clients 
于 2012-09-06T04:49:58.747 に答える