2011-11-28 19 views
18

Ho bisogno di restituire i record su una tabella e il mio set di risultati deve contenere un elenco separato da virgole.sub query del server sql con un set di risultati separato da virgole

Ho allegato un'immagine delle 3 tabelle. Devo eseguire una selezione che restituisca il record nella prima tabella e includa l'ultimo di AwardFocusName presente nella terza tabella nello screenshot.

Quindi il mio set di risultati restituirebbe un record e includerà l'elenco di AwardFocusNames in esso (separati da virgola).

enter image description here

+0

Quali sono i nomi di tabella? – ManseUK

+0

I nomi delle tabelle sono Nomination, AwardFocus, NominationAwardFocus (nell'ordine in cui appaiono nello screenshot). – obautista

risposta

43

Ecco un trucco che ho usato in passato per fare cose simili

 

    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

Dovresti provare questo con un 'awardFocusName' che contiene un' & '. Non è carino –

+0

Mi sono imbattuto nel problema, ma un semplice REPLACE ha risolto il problema. – Hagelt18

+0

ottima risposta! – jhilden

1

ritengo la soluzione migliore sarebbe quella di creare un aggregato definito dall'utente che concatena i valori (in gruppo) in un elenco separato. Vedere Esempio 1 a: http://msdn.microsoft.com/en-us/library/ms131056.aspx

Usage:

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

creare una funzione di valori scalari come questo

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 
Problemi correlati