none
Raggruppamento detail in un campo RRS feed

  • Domanda

  • salve a tutti,

    ho due tabelle in una situazione classica di master detail. Vorrei sapere se è possibile ottenere con una query, una lista con record master e in un solo campo le descrizioni della tabella details. Praticamente, con queste tabelle :

    CREATE TABLE [dbo].[TB_Master](
     [ID] [int] NOT NULL,
     [Name] [varchar](50) NOT NULL,
     CONSTRAINT [PK_TB_Master] PRIMARY KEY CLUSTERED
    (
     [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] ;

     


    CREATE TABLE [dbo].[TB_Detail](
     [ID] [int]  NOT NULL,
     [ID_Master] [int] NOT NULL,
     [Description] [varchar](50) NOT NULL,
     CONSTRAINT [PK_TB_Detail] PRIMARY KEY CLUSTERED
    (
     [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] ;


    ALTER TABLE [dbo].[TB_Detail]  WITH CHECK ADD  CONSTRAINT [FK_TB_Detail_TB_Master] FOREIGN KEY([ID_Master])
    REFERENCES [dbo].[TB_Master] ([ID]);

    ALTER TABLE [dbo].[TB_Detail] CHECK CONSTRAINT [FK_TB_Detail_TB_Master] ;

     

    insert into TB_Master(ID,[Name]) values (1,'Nome 1');
    insert into TB_Master(ID,[Name]) values (2,'Nome 2');
    insert into TB_Master(ID,[Name]) values (3,'Nome 3');

    insert into TB_Detail(ID,ID_Master,[Description]) values (1,1,'Descrizione 1-A');
    insert into TB_Detail(ID,ID_Master,[Description]) values (2,1,'Descrizione 1-B');
    insert into TB_Detail(ID,ID_Master,[Description]) values (3,1,'Descrizione 1-C');

    insert into TB_Detail(ID,ID_Master,[Description]) values (4,2,'Descrizione 2-A');
    insert into TB_Detail(ID,ID_Master,[Description]) values (5,2,'Descrizione 2-B');

     

    è possibile avere questo risultato

    ID   Name      Descriptions
    1    Nome 1    Descrizione 1-A,Descrizione 1-B,Descrizione 1-C

    2    Nome 2    Descrizione 2-A,Descrizione 2-B

    3    Nome 3   

     

    ciao e grazie

     


    • Modificato G Luca martedì 6 dicembre 2011 10:30
    martedì 6 dicembre 2011 10:30

Risposte

  • Se stai lavorando con SQL Server 2005 o superiori puoi usare la funzione STUFF() insieme al comando FOR XML, in questo modo:

    SELECT
        Name,
        COALESCE(STUFF((SELECT N', ' + Description FROM TB_Detail WHERE ID_Master=M.ID FOR XML PATH('')),1,1,N''), '') AS Detail
    FROM
        TB_Master M

    Ottenendo:

    1    Nome 1     Descrizione 1-A, Descrizione 1-B, Descrizione 1-C
    2    Nome 2     Descrizione 2-A, Descrizione 2-B
    3    Nome 3   

    HTH


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD Questo post è fornito "così com'è". Non conferisce garanzie o diritti di alcun tipo. Ricorda di usare la funzione "segna come risposta" per i post che ti hanno aiutato a risolvere il problema e "deseleziona come risposta" quando le risposte segnate non sono effettivamente utili. Questo è particolarmente utile per altri utenti che leggono il thread, alla ricerca di soluzioni a problemi similari. ENG: This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" on the post that helps you, and to click "Unmark as Answer" if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
    • Contrassegnato come risposta G Luca martedì 6 dicembre 2011 13:58
    martedì 6 dicembre 2011 13:41

Tutte le risposte

  • Se stai lavorando con SQL Server 2005 o superiori puoi usare la funzione STUFF() insieme al comando FOR XML, in questo modo:

    SELECT
        Name,
        COALESCE(STUFF((SELECT N', ' + Description FROM TB_Detail WHERE ID_Master=M.ID FOR XML PATH('')),1,1,N''), '') AS Detail
    FROM
        TB_Master M

    Ottenendo:

    1    Nome 1     Descrizione 1-A, Descrizione 1-B, Descrizione 1-C
    2    Nome 2     Descrizione 2-A, Descrizione 2-B
    3    Nome 3   

    HTH


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD Questo post è fornito "così com'è". Non conferisce garanzie o diritti di alcun tipo. Ricorda di usare la funzione "segna come risposta" per i post che ti hanno aiutato a risolvere il problema e "deseleziona come risposta" quando le risposte segnate non sono effettivamente utili. Questo è particolarmente utile per altri utenti che leggono il thread, alla ricerca di soluzioni a problemi similari. ENG: This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" on the post that helps you, and to click "Unmark as Answer" if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
    • Contrassegnato come risposta G Luca martedì 6 dicembre 2011 13:58
    martedì 6 dicembre 2011 13:41
  • Se stai lavorando con SQL Server 2005 o superiori puoi usare la funzione STUFF() insieme al comando FOR XML, in questo modo:

    SELECT
        Name,
        COALESCE(STUFF((SELECT N', ' + Description FROM TB_Detail WHERE ID_Master=M.ID FOR XML PATH('')),1,1,N''), '') AS Detail
    FROM
        TB_Master M

    Ottenendo:

    1    Nome 1     Descrizione 1-A, Descrizione 1-B, Descrizione 1-C
    2    Nome 2     Descrizione 2-A, Descrizione 2-B
    3    Nome 3   

    HTH


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD Questo post è fornito "così com'è". Non conferisce garanzie o diritti di alcun tipo. Ricorda di usare la funzione "segna come risposta" per i post che ti hanno aiutato a risolvere il problema e "deseleziona come risposta" quando le risposte segnate non sono effettivamente utili. Questo è particolarmente utile per altri utenti che leggono il thread, alla ricerca di soluzioni a problemi similari. ENG: This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" on the post that helps you, and to click "Unmark as Answer" if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
    Grazie mille, non solo funziona prefettamente ma mi hai anche dato argomenti nuovi da approfondire
    martedì 6 dicembre 2011 13:58