2016-05-02 13 views
0

UPDATEとINNER JOINを使用してstuffクエリを成功させようとしています。 私はクエリの結果を1つの列/行に埋め込み、その結果を持つ別のテーブルを更新する必要があります。UPNATEをINNER JOINとSTUFF関数と組み合わせる

私の現在のコードはこれです。

Update t1 
SET t1.col1 = t2.ordernotes 
FROM db.dbo.table1 t1 
INNER JOIN 
    STUFF((
      (Select order_no, Notes As ordernotes 
      FROM db.dbo.table2 
      GROUP BY order_no 
      ORDER BY TimeStamp 
      FOR XML PATH('') 
      ),1,1,'') 
      As t2 
ON t2.order_no = t1.order_no 

内でクエリが次の結果

Order_no | OrderNotes 
1234  | Note 1 
1234  | Note 2 
1234  | Note 3 

戻る参加所望の結果は、このされ、次に1

Order_no | OrderNotes 
1234  | Note 1, Note 2, Note 3 

答えて

2

一つの方法は、cross apply使用テーブルに更新:

Update t1 
    SET t1.col1 = t2.ordernotes 
    FROM db.dbo.table1 t1 CROSS APPLY 
     (SELECT STUFF((SELECT ', ' + t1.Notes 
         FROM db.dbo.table2 
         WHERE t2.order_no = t1.order_no 
         ORDER BY t2.TimeStamp 
         FOR XML PATH('') 
         ), 1, 2, '' 
        ) as ordernotes 
     ) t2; 

は、しかし、文字列の連結のためのtypeを使用しての習慣に取得した方がよい:

Update t1 
    SET t1.col1 = t2.ordernotes 
    FROM db.dbo.table1 t1 CROSS APPLY 
     (SELECT STUFF((SELECT ', ' + t1.Notes 
         FROM db.dbo.table2 
         WHERE t2.order_no = t1.order_no 
         ORDER BY t2.TimeStamp 
         FOR XML PATH(''), TYPE 
         ).VALUE('.', 'nvarchar(max)' 
          ), 1, 2, '' 
        ) as ordernotes 
     ) t2; 
+0

は、ソリューションをありがとうございました。両方のテーブルの列がnvarchar(max)に設定されていても、引き続き 'type'を使用するのがベストですか? –

+0

@DesHutch。 。 。はい。 'TYPE'はXMLから値を抽出することです。これにより、 "<" and ">"のような文字を問題なく通過させることができます。 –

関連する問題