sql >> Base de Datos >  >> RDS >> Sqlserver

Seleccione de nuevo una lista delimitada por comas agrupada por una 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

Disección de la consulta

La consulta principal hace un group by por lo que solo obtiene una fila para cada EntryID .

La columna TagsCommaDelimited se crea con una subconsulta correlacionada.

En SQL Server for xml path se utiliza para crear una representación XML del resultado de una consulta. Tiene un buen control sobre cómo se crea el XML mediante el uso de alias de columna y los parámetros para path y root .

El valor concatenado ', '+T.Name en la subconsulta correlacionada no tendrá un nombre de columna y el parámetro vacío para for xml path('') crea el xml sin ninguna etiqueta en absoluto. Solo se devolverá un valor de texto.

Cuando agrega type a un for xml consulta el tipo de datos será XML .

Para obtener un valor de un XML, debe usar value() método. Podría convertir a una cadena, pero si lo hiciera, por ejemplo, obtendría & en la cadena donde haya usado & .

El primer parámetro en el value() La función es la expresión xQuery utilizada para obtener el valor que desea. Utilice text() para especificar que solo desea el valor para el elemento actual. [1] le está diciendo a SQL Server que desea que se encuentre el primer nodo de texto (solo tiene uno aquí) pero aún es necesario.

La cadena creada por for xml query tiene una coma adicional y un espacio al comienzo de la cadena y debe eliminarse. Aquí uso la función XQuery substring para obtener todo excepto los dos primeros caracteres.

El segundo parámetro de value() especifica el tipo de datos que se debe devolver.