none
Unir dois selects RRS feed

  • Pergunta

  • Boa tarde, já faz algum tempo que nao trabalho com sql e estou precisando unir dois selects mas nao sei como, algume poderia me ajudar?

    Select 1:

    select Group1.GroupName, group1.distinguishedname, count (*) 'Membros',
    (select count (*) from adcomputer c
    left join adgroupmember gm2 on c.distinguishedname=gm2.memberdistinguishedname
    where gm2.GroupDistinguishedName = group1.distinguishedname) 'Computadores'
    from
    ADGroup Group1
    left join
    ADGroupmember gm on group1.distinguishedname=gm.groupdistinguishedname
    Group by Group1.GroupName, group1.distinguishedname
    order by Group1.GroupName

    Select 2:

    select Group1.GroupName, group1.distinguishedname, COUNT (*) 'Usuarios'
    from
    ADGroup Group1
    left join
    ADGroupmember gm on group1.distinguishedname=gm.groupdistinguishedname
    left join
    ADUser u on u.distinguishedName=gm.MemberDistinguishedName
    group by Group1.GroupName, group1.DistinguishedName
    order by Group1.GroupName

    Aguardo uma resposta pessoal.

    quinta-feira, 13 de setembro de 2012 18:20

Respostas

  • Tudo bem. Se resolve pra você, show.

    Mas Union/Union All tem que funcionar.

    Provavelmente não estava funcionando pelo fato de seus Selects possuírem quantidade diferente de campos ou campos com tipos incompatíveis entre si.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:06
    quinta-feira, 13 de setembro de 2012 18:58
    Moderador
  • Arnaldo

    Você não esta unindo os resultados, vc esta fazendo um relacionamento entre os resultados, e vai exibir todos os registro do 1º select e os registros de mesmo distinguishedname do select 2

    Se existir registro no select 2 que nao existe no select 1 ele será ignorado.


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:04
    • Não Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:05
    • Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:06
    quinta-feira, 13 de setembro de 2012 19:00
    Moderador

Todas as Respostas

  • Arnaldo

    vc pode usar o union

    OBS. nao avalei a qualidade do seu select, embora acho que da para fazer em uma unica CTE, segue exemplo usando o seu select

    Select GroupName,distinguishedname,Membros,Computadores,Usuarios
    FROM
    (
        select Group1.GroupName, group1.distinguishedname, count (*) 'Membros', 
        (select count (*) from adcomputer c 
        left join adgroupmember gm2 on c.distinguishedname=gm2.memberdistinguishedname
        where gm2.GroupDistinguishedName = group1.distinguishedname) 'Computadores',Usuarios=null
        from 
        ADGroup Group1
        left join
        ADGroupmember gm on group1.distinguishedname=gm.groupdistinguishedname
        Group by Group1.GroupName, group1.distinguishedname
        --order by Group1.GroupName
        union all
        select Group1.GroupName, group1.distinguishedname, Membros=null, Computadores=null, COUNT (*) 'Usuarios'
        from
        ADGroup Group1
        left join
        ADGroupmember gm on group1.distinguishedname=gm.groupdistinguishedname
        left join
        ADUser u on u.distinguishedName=gm.MemberDistinguishedName
        group by Group1.GroupName, group1.DistinguishedName
    ) x
    order by GroupName


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 13 de setembro de 2012 18:40
    Moderador
  • Use o operador Union (ou Union All, dependendo do objetivo). Você sempre tem que ter a mesma quantidade de campos nos dois Selects. E os campos precisam ter tipos compatíveis entre os Selects.

    Mais informações : http://msdn.microsoft.com/pt-br/library/ms180026.aspx

    Exemplo:

    select
      Group1.GroupName,
      group1.distinguishedname,
      count (*) 'Membros', 
      (select count (*) from adcomputer c left join adgroupmember gm2 on c.distinguishedname=gm2.memberdistinguishedname
       where gm2.GroupDistinguishedName = group1.distinguishedname) 'Computadores'
    from 
      ADGroup Group1 left join ADGroupmember gm on group1.distinguishedname=gm.groupdistinguishedname
    Group by
      Group1.GroupName,
      group1.distinguishedname
    
    UNION
    
    select
      Group1.GroupName,
      group1.distinguishedname,
      COUNT (*) 'Usuarios',
      Computadores = Convert(int, Null)
    from
      ADGroup Group1 left join ADGroupmember gm on group1.distinguishedname=gm.groupdistinguishedname
                     left join ADUser u on u.distinguishedName=gm.MemberDistinguishedName
    group by
      Group1.GroupName,
      group1.DistinguishedName
    order by
      Group1.GroupName


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    quinta-feira, 13 de setembro de 2012 18:42
    Moderador
  • Ola Marcelo e Roberto, entao, eu tinha esquecido de mencionar que o union ou union all nao estavam funcionando mas acabei achando uma outra solucao pra esse problema, segue agora pra voces conferirem e muito obrigado pela ajuda.

    Select:

    select Group1.GroupName, group1.distinguishedname, count (*) 'Membros', 
    (select count (*) from adcomputer c 
    left join adgroupmember gm2 on c.distinguishedname=gm2.memberdistinguishedname
    where gm2.GroupDistinguishedName = group1.distinguishedname) 'Computadores',
    (select count (*) from ADUser a
    left join ADGroupMember gm2 on a.distinguishedName=gm2.MemberDistinguishedName
    where gm2.GroupDistinguishedName = group1.distinguishedname) 'Usuarios'
    from 
    ADGroup Group1
    left join
    ADGroupmember gm on group1.distinguishedname=gm.groupdistinguishedname
    Group by Group1.GroupName, group1.distinguishedname
    order by Group1.GroupName

    É uma outra forma de unir os selects sem usar os operadores union/union all que no meu caso nao estavam funcionando.
    • Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:05
    • Não Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:06
    quinta-feira, 13 de setembro de 2012 18:51
  • Tudo bem. Se resolve pra você, show.

    Mas Union/Union All tem que funcionar.

    Provavelmente não estava funcionando pelo fato de seus Selects possuírem quantidade diferente de campos ou campos com tipos incompatíveis entre si.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:06
    quinta-feira, 13 de setembro de 2012 18:58
    Moderador
  • Arnaldo

    Você não esta unindo os resultados, vc esta fazendo um relacionamento entre os resultados, e vai exibir todos os registro do 1º select e os registros de mesmo distinguishedname do select 2

    Se existir registro no select 2 que nao existe no select 1 ele será ignorado.


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:04
    • Não Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:05
    • Marcado como Resposta ACLR quinta-feira, 13 de setembro de 2012 19:06
    quinta-feira, 13 de setembro de 2012 19:00
    Moderador
  • Olá Marcelo e Roberson, entao como disse antes, preciso estudar mais já faz muito tempo que nao uso sql e estou revendo ele agora entao é praticamente certeza que perdi muita coisa, mas obrigado pela ajuda e pelas dicas.

    Irei procurar saber porque o union/union all nao está funcionando e me atualizar mais, obrigado mesmo.

    quinta-feira, 13 de setembro de 2012 19:04
  • Arnaldo, o UNION faz um distinct nos dados, enquanto o UNION ALL não faz, essa é a diferença básica entre os dois.
    quinta-feira, 13 de setembro de 2012 20:06
  • Opa, valeu Leonardo, já tinha visto isso na pesquisa que fiz antes mas valeu pela informacao cara, abs

    Arnaldo Lechner - Analista de Desenvolvimento contato: arnaldo.lechner@gmail.com Twitter: @lechnerarnaldo

    quinta-feira, 13 de setembro de 2012 20:08