sql >> Database teknologi >  >> RDS >> Sqlserver

Vælg tilbage en kommasepareret liste grupperet efter et 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

Dissektion af forespørgslen

Hovedforespørgslen foretager en group by så du får kun én række for hver EntryID .

Kolonnen TagsCommaDelimited er oprettet med en korreleret underforespørgsel.

I SQL Server for xml path bruges til at oprette en XML-repræsentation af et forespørgselsresultat. Du har god kontrol over, hvordan XML'en oprettes ved at bruge kolonnealiaser og parametrene til path og root .

Den sammenkædede værdi ', '+T.Name i den korrelerede underforespørgsel vil ikke have et kolonnenavn og den tomme parameter til for xml path('') opretter xml uden nogen tags overhovedet. Der returneres kun én tekstværdi.

Når du tilføjer type til en for xml forespørgsel, vil datatypen være XML .

For at få en værdi ud af en XML skal du bruge value() metode. Du kunne caste til en streng, men hvis du gjorde det, ville du f.eks. få & i strengen, uanset hvor du har brugt & .

Den første parameter i value() funktion er xQuery-udtrykket, der bruges til at få den værdi, du ønsker. Brug text() for at angive, at du kun vil have værdien for det aktuelle element. [1] fortæller SQL Server, at du vil have den første tekstnode fundet (du har kun en her), men det er stadig nødvendigt.

Strengen oprettet af for xml forespørgslen har et ekstra komma og et mellemrum i begyndelsen af ​​strengen, og det skal fjernes. Her bruger jeg XQuery-funktionen substring for at få alt undtagen de to første tegn.

Den anden parameter til value() angiver den datatype, der skal returneres.



  1. php+mysql:indsæt et php-array i mysql

  2. SQLite og database initialisering

  3. Når du kører UPDATE ... datetime =NU(); vil alle opdaterede rækker have samme dato/tid?

  4. Sådan omdefineres de kolonner, der returneres af en lagret procedure i SQL Server