2011-11-28 6 views
18

Necesito devolver registros en una tabla y mi conjunto de resultados debe contener una lista separada por comas.sql subconsulta del servidor con un conjunto de resultados separados por comas

Adjunto una imagen de las 3 tablas. Necesito hacer una selección que devuelva el registro en la primera tabla e incluir el último de AwardFocusName que existe en la tercera tabla en la captura de pantalla.

Así que mi conjunto de resultados devolverá un registro e incluirá la lista de AwardFocusNames en él (separados por comas).

enter image description here

+0

¿Cuáles son los nombres de las tablas? – ManseUK

+0

Los nombres de tabla son Nomination, AwardFocus, NominationAwardFocus (en el orden en que aparecen en la captura de pantalla). – obautista

Respuesta

43

He aquí un truco que he utilizado en el pasado para hacer cosas similares

 

    SELECT n.nominationID 
     , SUBSTRING((
          SELECT ',' + af.awardFocusName 
          FROM NominationAwardFocus naf 
          JOIN AwardFocus af 
           ON naf.awardFocusID = af.awardFocusID 
          WHERE n.nominationID = naf.nominationID 
          FOR XML PATH('') 

         ), 2, 1000000) 
    FROM Nomination n 

+1

Debería probar esto con un 'awardFocusName' que contiene un' & '. No es lindo. –

+0

Me encontré con el & problema, pero un simple REEMPLAZAR solucionó el problema. – Hagelt18

+0

excelente respuesta! – jhilden

1

Creo que la mejor solución sería la creación de un agregado definido por el usuario que concatena los valores (en un grupo) en una lista separada por comas. Ver Ejemplo 1 en: http://msdn.microsoft.com/en-us/library/ms131056.aspx

Uso:

SELECT 
    Nomination.NominationId, 
    Nomination.Created, 
    Nomination.Updated, 
    dbo.Concatenate(AwardFocus.AwardFocusName) As Names 
FROM 
    Nomination 
    JOIN NominationAwardFocus 
     ON Nomination.NominationId = NominationAwardFocus.NominationId 
    JOIN AwardFocus 
     ON NominationAwardFocus.AwardFocusId = AwardFocus.AwardFocusId 
GROUP BY 
    Nomination.NominationId, 
    Nomination.Created, 
    Nomination.Updated 
1

crear una función escalar de valor como esto

CREATE FUNCTION [dbo].[CreateCSV](
    @Id AS INT 
) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    Declare @lst varchar(max) 

    select @lst = isnull(@lst+',','')+AF.AwardFocusName 
    from AwardFocus as AF 
    inner join AwardFoccusNomination as AFN 
     on AF.AwardFocusID = AFN.AwardFocusID 
    where [email protected] 


    return @lst 

END 
Cuestiones relacionadas