none
Como concatenar resultados e atualizar a tabela RRS feed

  • Pergunta

  • Estou com a seguinte questão, tenho 3 tabelas:

    1º - Tabela de Usuários que contém coluna ID e uma coluna chamada eMail

    2º - Tabela de Grupos que contém coluna ID e uma coluna chamada eMail

    3º - Tabela de Relacionamentos que contém uma Coluna com a ID do Grupo e uma ID do usuário.

    Criando um select que traga a ID do grupo e o eMail dos usuários que estão no grupo. ex:

    select g.id, u.email

    from Grupos g

    join UsuariosXGrupo UXG on UXG.Grupo=g.id

    join usuarios u on UXG.Usuario=u.id

    Order by g.id, u.email

    o Resultado será

    ID do Grupo  EMail

    1 1545@nd.com

    1 2545@nd.com

    1 3545@nd.com

    2 4235@nd.com

    2 775@nd.com

    Preciso concatenar os e-mails dos usuários que estão no grupo e Atualizar o resultado no campo eMail da tabela de Grupos semelhante a:

    ID do Grupo  Email

    1 1545@nd.com, 2545@nd.com, 3545@nd.com

    2 4235@nd.com, 775@nd.com

    terça-feira, 12 de março de 2013 20:55

Respostas

  • Boa tarde,

    Experimente dessa forma:

    with CTE_Ag as
    (
        select 
            g.id,
            STUFF
                ( (SELECT ', ' + s.email
                   FROM UsuariosXGrupo UXG 
                   join usuarios u on UXG.Usuario = u.id
                   where UXG.Grupo = g.id	
                   order by u.email
                   FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
                    ,1, 2, '') as Email
        from Grupos g
    )
    
    update g
    set g.Email = c.Email
    from Grupos as g
    inner join CTE_Ag as c
        on c.id = g.id

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 13 de março de 2013 21:21

Todas as Respostas

  • Boa noite,

    Para concatenar os e-mails confira o tópico abaixo:

    http://social.msdn.microsoft.com/Forums/pt-BR/520/thread/1057670a-f0f3-4205-9f6d-985f74d84a32/#b37ccc2b-85b6-457a-bed6-c9c3b761f5b6

    Para atualizar você pode colocar a query para concatenar dentro de um CTE, para depois utilizar um Join. Ex:

    with CTE_Ag as
    (
        -- query para concatenar
    )
    
    update g
    set g.Email = c.Email
    from Grupos as g
    inner join CTE_Ag as c
        on c.id = g.id

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 12 de março de 2013 21:37
  • Diego, complementando a resposta do Gapimex a qual concordo, segue um script de concatenação para voce utilizar com o CTE, criei uma tabela de grupos baseada na que voce deve ter:

    Create table Grupo (ID int, email varchar(200))
    
    insert into grupo
    values (1,'1545@nd.com'),
    (1,'2545@nd.com'),
    (1,'3545@nd.com'),
    (2,'4235@nd.com'),
    (2,'775@nd.com')
    
    
    SELECT distinct
        t.ID,
        STUFF( (SELECT ',' + s.email
                FROM grupo as s
                where S.ID = T.ID
                FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
                ,1, 1, '') as COL1
    FROM grupo as t
    ORDER BY 
       1,2


    Alexandre Matayosi Conde Mauricio.

    terça-feira, 12 de março de 2013 21:52
  • Boa Tarde Galera!

    Obrigado pela luz, mas percebi que eu tenho que estudar mais... heheh

    Seguinte pelo que percebi as querys acima irão criar para os grupos os e-mails de todos os valores da tabela de usuários.

    A grande chave é que existe uma tabela de relacionamento onde X usuários pertencem ao grupo Y ,e também Z usuários pertencem ao grupo P

    Preciso que seja concatenado os emails dos usuários por cada grupo vinculado.

    Entenderam? 

    quarta-feira, 13 de março de 2013 19:50
  • Boa tarde,

    Experimente dessa forma:

    with CTE_Ag as
    (
        select 
            g.id,
            STUFF
                ( (SELECT ', ' + s.email
                   FROM UsuariosXGrupo UXG 
                   join usuarios u on UXG.Usuario = u.id
                   where UXG.Grupo = g.id	
                   order by u.email
                   FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
                    ,1, 2, '') as Email
        from Grupos g
    )
    
    update g
    set g.Email = c.Email
    from Grupos as g
    inner join CTE_Ag as c
        on c.id = g.id

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 13 de março de 2013 21:21
  • =DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

    Funcionou!!!

    Muito obrigado a todos, mas agora sem querer ser joão sem braço .. onde posso achar a documentação para a técnica utilizada??

    Abraço!

    sexta-feira, 15 de março de 2013 14:28
  • bom dia, se voce instalou o SQL completo deve ter o books online, procure por Stuff e CTE que terá as informações la, ou então no google mesmo, ha varios blogs dando dicas e mostrando como funciona de forma bem interessante.

    Alexandre Matayosi Conde Mauricio.

    sexta-feira, 15 de março de 2013 14:37