Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wählen Sie eine durch Kommas getrennte Liste aus, die nach einer ID gruppiert ist

select ET1.EntryID,
       (
       select ', '+T.Name
       from Tags as T
         inner join EntryTag as ET2
           on T.TagID = ET2.TagID
       where ET1.EntryID = ET2.EntryID
       for xml path(''), type
       ).value('substring(text()[1], 3)', 'varchar(max)') as TagsCommaDelimited
from EntryTag as ET1
group by ET1.EntryID

Analyse der Abfrage

Die Hauptabfrage führt ein group by durch Sie erhalten also nur eine Zeile für jede EntryID .

Die Spalte TagsCommaDelimited wird mit einer korrelierten Unterabfrage erstellt.

In SQL Server für XML-Pfad wird verwendet, um eine XML-Darstellung eines Abfrageergebnisses zu erstellen. Sie haben eine gute Kontrolle darüber, wie das XML erstellt wird, indem Sie Spaltenaliase und die Parameter für path verwenden und root .

Der verkettete Wert ', '+T.Name in der verknüpften Unterabfrage keinen Spaltennamen und den leeren Parameter for xml path('') haben erstellt die XML-Datei überhaupt ohne Tags. Es wird nur ein Textwert zurückgegeben.

Wenn Sie geben zu einem für xml Abfrage ist der Datentyp XML .

Um einen Wert aus einem XML zu erhalten, sollten Sie den value( ) Methode. Sie könnten in einen String umwandeln, aber wenn Sie das täten, würden Sie zum Beispiel & erhalten in der Zeichenfolge, wo immer Sie & verwendet haben .

Der erste Parameter in value() function ist der xQuery-Ausdruck, der zum Abrufen des gewünschten Werts verwendet wird. Verwenden Sie text() um anzugeben, dass Sie nur den Wert für das aktuelle Element möchten. [1][code> teilt SQL Server mit, dass Sie den ersten gefundenen Textknoten haben möchten (Sie haben hier nur einen), aber es ist immer noch notwendig.

Die Zeichenfolge, die von for xml erstellt wurde query hat ein zusätzliches Komma und ein Leerzeichen am Anfang der Zeichenfolge, die entfernt werden müssen. Hier verwende ich die XQuery-Funktion substring um alles außer den ersten beiden Zeichen zu erhalten.

Der zweite Parameter zu value() gibt den Datentyp an, der zurückgegeben werden soll.