2016-05-02 6 views
0

Ich versuche, eine Stuff-Abfrage mit einem UPDATE und INNER JOIN ohne Erfolg zu verwenden. Ich muss die Ergebnisse einer Abfrage in eine Spalte/Zeile stopfen und eine andere Tabelle mit diesem Ergebnis aktualisieren.Kombiniere UPDATE mit INNER JOIN und STUFF Funktion

Mein aktueller Code ist dies.

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 

Die Abfrage in der inneren liefert folgendes Ergebnis

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

Das gewünschte Ergebnis dieser Verknüpfung ist und dann in die Tabelle aktualisiert 1

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

Antwort

2

Ein Verfahren verwendet 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; 

Allerdings ist es besser, die Gewohnheit zu bekommen verwenden type für String-Verkettung:

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

Sie für die Lösung danken. Ist es immer noch am besten, 'type' zu verwenden, obwohl die Spalte in beiden Tabellen bereits auf nvarchar (max) gesetzt ist? –

+0

@DesHutch. . . Ja. Bei 'TYPE' geht es darum, den Wert aus XML zu extrahieren. Damit können Zeichen wie "<" and ">" problemlos durchlaufen werden. –