none
SELECT RRS feed

  • Pergunta

  • Boa noite, tudo bem?

    eu preciso fazer um SELECT +/- assim

    Tenho a tabela Papel:
    ID_Papel
    1 - Clientes
    2 - Formecedores
    3 - Funcionarios

    Tenho a Tabela Pessoas
    ID_Pessoa
    1 - Jose
    2 - Antonio
    3 - Flavio

    Tenho a Tabela que relaciona o Papel a Pessoa
    ID  -   ID_Pessoa  -  ID_Papel
    1           1                    1

    Preciso fazer uma view que traga os papeis disponivel para a Pessoa.

    Obrigado!

    terça-feira, 9 de abril de 2019 04:05

Respostas

  • Deleted
    • Marcado como Resposta DaviSaba terça-feira, 9 de abril de 2019 13:08
    terça-feira, 9 de abril de 2019 10:03
  • Preciso fazer uma view que traga os papeis disponivel para a Pessoa.

    Davi, o que entendi é que necessita de uma relação de quais papeis uma pessoa ainda não possui.

    Considerando-se a teoria dos conjuntos, que é um dos pilares do SQL, basta fazer
         C = B - A
    onde B são todos os papeis disponiveis para cada pessoa e A os papeis que cada pessoa já possui.

    -- código #1
    SELECT Pe.ID_Pessoa, Pa.ID_Papel
      from Pessoa as Pe
           cross join Papel as Pa
    
    except
    
    SELECT Id_Pessoa, ID_Papel
      from Papel_Pessoa;

     

    Também é possível resolver de outras formas: LEFT JOIN, NOT EXISTS etc.

    NOT EXISTS

    -- código #2
    SELECT Pe.ID_Pessoa, Pa.ID_Papel
      from Pessoa as Pe
           cross join Papel as Pa
      where not exists (SELECT * from Papel_Pessoa as PP
                          where PP.ID_Pessoa = Pe.ID_Pessoa 
                                and PP.ID_Papel = Pa.ID_Papel);

    LEFT JOIN

    -- código #3
    SELECT Pe.ID_Pessoa, Pa.ID_Papel
      from Pessoa as Pe
           cross join Papel as Pa
      left join Papel_Pessoa as PP
      where PP.ID_Pessoa is null
            and PP.ID_Papel is null;


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    José,

    Particularmente eu perfiro utilizar o Not In ao invés do Not Exists.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta DaviSaba terça-feira, 9 de abril de 2019 13:08
    terça-feira, 9 de abril de 2019 12:30

Todas as Respostas

  • Deleted
    • Marcado como Resposta DaviSaba terça-feira, 9 de abril de 2019 13:08
    terça-feira, 9 de abril de 2019 10:03
  • Preciso fazer uma view que traga os papeis disponivel para a Pessoa.

    Davi, o que entendi é que necessita de uma relação de quais papeis uma pessoa ainda não possui.

    Considerando-se a teoria dos conjuntos, que é um dos pilares do SQL, basta fazer
         C = B - A
    onde B são todos os papeis disponiveis para cada pessoa e A os papeis que cada pessoa já possui.

    -- código #1
    SELECT Pe.ID_Pessoa, Pa.ID_Papel
      from Pessoa as Pe
           cross join Papel as Pa
    
    except
    
    SELECT Id_Pessoa, ID_Papel
      from Papel_Pessoa;

     

    Também é possível resolver de outras formas: LEFT JOIN, NOT EXISTS etc.

    NOT EXISTS

    -- código #2
    SELECT Pe.ID_Pessoa, Pa.ID_Papel
      from Pessoa as Pe
           cross join Papel as Pa
      where not exists (SELECT * from Papel_Pessoa as PP
                          where PP.ID_Pessoa = Pe.ID_Pessoa 
                                and PP.ID_Papel = Pa.ID_Papel);

    LEFT JOIN

    -- código #3
    SELECT Pe.ID_Pessoa, Pa.ID_Papel
      from Pessoa as Pe
           cross join Papel as Pa
      left join Papel_Pessoa as PP
      where PP.ID_Pessoa is null
            and PP.ID_Papel is null;


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    José,

    Particularmente eu perfiro utilizar o Not In ao invés do Not Exists.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta DaviSaba terça-feira, 9 de abril de 2019 13:08
    terça-feira, 9 de abril de 2019 12:30