sql >> Database >  >> RDS >> Sqlserver

Selecteer een door komma's gescheiden lijst terug, gegroepeerd op een ID

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

De vraag ontleden

De hoofdquery doet een group by dus je krijgt maar één rij voor elke EntryID .

De kolom TagsCommaDelimited is gemaakt met een gecorreleerde subquery.

In SQL Server for xml path wordt gebruikt om een ​​XML-weergave van een queryresultaat te maken. Je hebt goede controle over hoe de XML wordt gemaakt door kolomaliassen en de parameters naar path . te gebruiken en root .

De aaneengeschakelde waarde ', '+T.Name in de co-gerelateerde subquery heeft geen kolomnaam en de lege parameter voor for xml path('') creëert de xml zonder enige tags. Er wordt slechts één tekstwaarde geretourneerd.

Wanneer u type toevoegt naar een for xml query, het gegevenstype is XML .

Om een ​​waarde uit een XML te halen, moet u de value() methode. Je zou naar een string kunnen casten, maar als je dat deed, zou je bijvoorbeeld & . krijgen in de string waar je & . hebt gebruikt .

De eerste parameter in de value() functie is de xQuery-expressie die wordt gebruikt om de gewenste waarde te krijgen. Gebruik text() om aan te geven dat u alleen de waarde voor het huidige element wilt. [1] vertelt SQL Server dat u het eerste tekstknooppunt wilt vinden (u hebt er hier maar één) maar het is nog steeds noodzakelijk.

De tekenreeks gemaakt door de for xml query heeft een extra komma en een spatie aan het begin van de tekenreeks en die moet worden verwijderd. Hier gebruik ik de XQuery-functie substring om alles te krijgen behalve de eerste twee tekens.

De tweede parameter voor value() specificeert het datatype dat moet worden geretourneerd.



  1. Meerdere UNION-query's werken niet

  2. Is het mogelijk om gegevenscontrole in MySQL af te dwingen met behulp van reguliere expressie?

  3. Kan MySQL Cluster een terabyte database aan?

  4. Traagheid gevonden wanneer base 64-afbeelding selecteert en codeert uit database