Ir para conteúdo

POWERED BY:

Arquivado

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

freitastulio

Optimização do select

Recommended Posts

Boa tarde,

 

Estou com uma dificuldade para fazer uma consulta no mysql e gostaria de saber o que eu poderia fazer para resolver.

O problema é o seguinte:

 

Tenho uma tabela que contém ID e CPF de várias pessoas, por exemplo:

 

CPF ID

73155332001 49

55555555555 49

55555555555 61

45454545588 49

 

Como resultado, eu gostaria que me retornasse somente os CPFs que aparecem cadastrados com diferentes IDs, por exemplo o CPF 55555555555, que possui cadastro com o ID 49 e 61.

 

Eu utilizei o seguinte comando:

 

SELECT table1.CPF

FROM 2012cpf table1

WHERE

(

SELECT count(table2.CPF)

FROM 2012cpf table2

WHERE table2.ID = 61 AND

table2.CPF = table1.CPF) > 0

AND

(

SELECT count(table3.CPF)

FROM 2012cpf table3

WHERE table3.ID = 49 AND

table3.CPF = table1.CPF) > 0

 

O problema, é que ele fuciona para tabelas pequenas, porém, quando tento executar em uma base de 3GB ele fica processando e não dá nenhuma resposta. Alguém sabe como posso contornar isso?

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

cpf duplicados

 

select cpf
from tabela
group by cpf
having coun(*) > 1

 

Lista disto

 

select *
from tabela
where cpf in (select cpf
             from tabela
             group by cpf
             having coun(*) > 1)

 

Agora numa base grande pode demorar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cpf duplicados

 

select cpf
from tabela
group by cpf
having coun(*) > 1

 

Lista disto

 

select *
from tabela
where cpf in (select cpf
             from tabela
             group by cpf
             having coun(*) > 1)

 

Agora numa base grande pode demorar.

 

 

O problema é que usando o comando desta maneira, a pessoa pode aparecer com o mesmo ID e o mesmo cpf, por exemplo:

 

7313335551 49

7313335551 49

 

E este não é interessante para mim, porque gostaria somente dos que apresentam IDs distintos.

Outro motivo, é que eu gostaria de especificar os IDs, por exemplo, filtrar somente os CPFs que se repetem com ID 49 e 65.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Id não é único ?

 

select cpf
from
(
select distinct id,cpf
from tabela
) virtual
group by cpf
having count(*) > 1

 

select *
from tabela
where cpf in 
(select cpf
from
(
select distinct id,cpf
from tabela
) virtual
group by cpf
having count(*) > 1)

 

Agora a performance subiu no telhado ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Id não é único ?

 

select cpf
from
(
select distinct id,cpf
from tabela
) virtual
group by cpf
having count(*) > 1

 

select *
from tabela
where cpf in 
(select cpf
from
(
select distinct id,cpf
from tabela
) virtual
group by cpf
having count(*) > 1)

 

Agora a performance subiu no telhado ...

 

Obrigado pela resposta.

 

Exatamente, tentei executar aqui e dá a mesma coisa que meu código. Fica só processando =((

 

OBS: O ID é unico, mas como é uma folha de pagamentos, o mesmo funcionário aparecerá mais de uma vez com o mesmo código. O que eu queria, era selecionar as funções, no caso, os IDs e filtrar quais funcionários tinham 2 cargos dentro da empresa, por exemplo, id = 49 e 65.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim

 

select *
from tabela t1
where exists (select null
             from tabela t2
             where t2.id = t1.id
             and   t2.cpf <> t1.cpf)

 

Mas pelo visto será um procedimento corretivo , não deve ser executado mais uma vez.Assim a performance não é tão crucial.

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.