Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rafael Spessotto

Trazer registros que contenham apenas certos valores

Recommended Posts

Ola pessoa, sou meio inexperiente ainda em BD, e queria tirar uma duvida:

 

eu tenho uma tabela de PERMISSOES:

 

NOME ID_PERMISSAO

RAFAEL 1

LUIS 1

MARCOS 1

RAFAEL 2

MARCOS 2

 

Eu queria saber quem sao as pessoas que tem a permissão com numero 1 e 2, ou seja, SOMENTE as que tenham essas permissoes..No caso acima, o Luis nao pode aparecer pois ele so tem a permissao 1 e nao tem a 2... Da para entender? Queria saber como fazer uma query que traga esse resultado..

 

Abraços!

 

Rafael

Compartilhar este post


Link para o post
Compartilhar em outros sites

WHERE

IN

 

SELECT NOME,ID_PERMISSAO
FROM PERMISSOES
WHERE ID_PERMISSAO IN (1,2)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Motta!!! Obrigado pela resposta..so que desse jeito, ele vai trazer tambem o Luis, porque o Luis tem a permissao 1!! Eu so quero que me traga os que tem as permissoes 1 e 2... Ele nao pode retornar o Luis...

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente uma subconsulta:

select * from TABELA where id_permissao=1 and nome
in(select nome from tabela where id_permissao=2)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta..agora me responde: e se estiverem em duas tabelas?

 

Por exemplo

 

<<TB_PESSOA>>

ID NOME

1 RAFAEL

2 LUIS

3 MARCOS

 

<<TB_PERMISSAO>>

ID ID_PESSOA PERMISSAO

1 1 1

2 1 2

3 2 1

4 3 1

5 3 2

 

 

tem como?

 

Valews!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

JOIN entre as consultas:

declare @tb_pessoa table (nome varchar(max), id int)declare @tb_permissao table (id int, id_pessoa int, permissao int) insert into @tb_pessoa values ('RAFAEL',1)insert into @tb_pessoa values ('LUIS',2)insert into @tb_pessoa values ('MARCOS',3) insert into @tb_permissao values (1,1,1)insert into @tb_permissao values (2,1,2)insert into @tb_permissao values (3,2,1)insert into @tb_permissao values (4,3,1)insert into @tb_permissao values (5,3,2)  select p1.* from (select a.* from @tb_pessoa a inner join @tb_permissao b on a.id = b.id_pessoawhere b.permissao = 1 ) p1inner join (select a.* from @tb_pessoa a inner join @tb_permissao b on a.id = b.id_pessoawhere b.permissao = 2 ) p2on p1.nome = p2.nome 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra solução (sem join)

 

 

SELECT NOME,ID_PERMISSAO
FROM PERMISSOES
WHERE ID_PERMISSAO IN (SELECT ID_PERMISSAO 
                       FROM PERMISSOES 
                       WHERE ID_PERMISSAO IN (1,2)
                       GROUP BY ID_PERMISSAO 
                       HAVING COUNT(*) = 2)

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Outra solução (sem join)

 

 

SELECT NOME,ID_PERMISSAO
FROM PERMISSOES
WHERE ID_PERMISSAO IN (SELECT ID_PERMISSAO 
                       FROM PERMISSOES 
                       WHERE ID_PERMISSAO IN (1,2)
                       GROUP BY ID_PERMISSAO 
                       HAVING COUNT(*) = 2)

Bem melhor do que usar join, dependendo do volume de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae A Jr, valew pela resposta....Entao quer dizer que se eu tiver mais permissoes para testar, terei que fazer varios inner joins, um atras do outro? Nao tem um jeito mais facil para incluir novos IDs de Permissao para testar tb?

 

Por exemplo..Na sua query estamos vendo se o id procurado é 1 ou 2...E se eu incluir um codigo 3...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae A Jr, valew pela resposta....Entao quer dizer que se eu tiver mais permissoes para testar, terei que fazer varios inner joins, um atras do outro? Nao tem um jeito mais facil para incluir novos IDs de Permissao para testar tb?

 

Por exemplo..Na sua query estamos vendo se o id procurado é 1 ou 2...E se eu incluir um codigo 3...?

Poderia usar a solução do Motta, pois no meu caso, sim, seria um JOIN para cada permissão.

Em casos pequenos e de volumetria baixa pode-se fazer deste jeito, mas se precisa de algo mais dinamico, o post #7 se encaixa melhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae Motta, valew pela resposta...entao vamos la:

 

Se eu tivesse mais um codigo criado, vamos por exemplo, dizer que o codigo da permissao eh 3..entao ficaria:

 

SELECT NOME,ID_PERMISSAO FROM PERMISSOES 
WHERE ID_PERMISSAO IN 
(SELECT ID_PERMISSAO FROM PERMISSOES WHERE ID_PERMISSAO IN (1,2,3) 
GROUP BY ID_PERMISSAO HAVING COUNT(*) = 2)

 

é isso?

 

Aqui pra mim o "HAVING COUNT(*) = 2 nao funfa..se eu tiro ele da query ele me traz de boa.. agora como ele nao funfa... :(

 

Valew pessoal!



Ah e outra coisa.. eu nao tenho o NOME na TB_PERMISSAO..



Eu tinha chegado a essa query, mas queria saber se tem um jeito de melhora-la para nao ter que ficar fazendo uma linha por permissao...

 

select P.NOME, P.ID_TIPO_PESSOA, A.ID_NA from TB_NIVEL_ACESSO_CREDENCIAL A, TB_PESSOA P
where A.ID_PESSOA = P.ID
and P.ID_TIPO_PESSOA = 121
and P.id in (select ID_PESSOA from TB_NIVEL_ACESSO_CREDENCIAL where ID_NA = 4)
and P.id in (select ID_PESSOA from TB_NIVEL_ACESSO_CREDENCIAL where ID_NA = 5)
and P.id in (select ID_PESSOA from TB_NIVEL_ACESSO_CREDENCIAL where ID_NA = 6)
group by P.NOME, P.ID_TIPO_PESSOA, A.ID_NA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rafael,

o having é uma função agregadora. Para saber um pouco mais HAVING

 

Pegando um "gancho" no exemplo do Motta, pode-se como no exemplo abaixo.

Não tem como fazer muito dinamico, pois os critérios podem mudar e com isso a sintaxe em algum ponto tem que mudar.

No exemplo abaixo, se voce inserir outro nome com a permissao 1 nao ira aparecer, somente qm tem permissao 1 E 2.

 

 

declare @tb_pessoa table (nome varchar(max), id int)declare @tb_permissao table (id int, id_pessoa int, permissao int) insert into @tb_pessoa values ('RAFAEL',1)insert into @tb_pessoa values ('LUIS',2)insert into @tb_pessoa values ('MARCOS',3) insert into @tb_permissao values (1,1,1)insert into @tb_permissao values (2,1,2) insert into @tb_permissao values (3,2,1)insert into @tb_permissao values (6,2,2) insert into @tb_permissao values (4,3,1)insert into @tb_permissao values (5,3,2)    SELECT * FROM @tb_pessoaWHERE id IN (SELECT id_pessoa                        FROM @tb_permissao                        WHERE permissao IN (1,2)                       GROUP BY id_pessoa                        HAVING COUNT(*) > 1)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Daria para usar o CHARINDEX

 

select *
from permissoes
where CHARINDEX(ID_PERMISSAO,'12') > 0

 

select *
from permissoes
where CHARINDEX(ID_PERMISSAO,'234') > 0

Apenas, o "tipo" tem de ser simples sem repetir (1,2,3,4), algo do tipo 1 , 11 , baba

 

Não sei se Sql Server convert string <> integer

Compartilhar este post


Link para o post
Compartilhar em outros sites

CHARINDEX não funciona em campo <> de texto.

Teria que converter para char (ou suas variaveis) ai utilizar, mas eu acho que não o caso do Rafael. Creio que o HAVING resolva o problema dele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A solução assim (No Oracle uso INSTR) só funciona com as restrições que falei.

 

O Oracle tem a "vantagem" de converter tudo tomaticamente ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.