Usuário com melhor resposta
SELECT

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!
Respostas
-
-
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
Todas as Respostas
-
-
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