Tenho a seguinte tabela SQL postgres com três colunas;
id linktype to_id
322754 4 1
322754 4 1
322754 4 2
322798 4 2
322798 4 2
322797 4 3
322791 4 6
322790 4 3
O que estou tentando fazer é filtrar to_id
valores onde há mais de um id
valor correspondente que seja diferente .
Então, a partir do exposto acima, eu simplesmente gostaria que to_id
o valor 3 fosse retornado, já que ele é o único to_id
que tem mais de um id DISTINCT correspondente a ele.
Use uma
having
cláusulade demonstração em db<>fiddle
Para tornar isso mais rápido, use
exists()
Ou uma autojunção:
Existem outros métodos que usam
except
/intersect
, umin/not in
, masexists()
geralmente são mais rápidos.Não se esqueça do índice:
Ele acelera as coisas para todos os 3 métodos acima, significativamente. Observe também que o método e o índice ideais dependem das características do seu conjunto de dados: em 100 mil registros onde apenas 807
to_id
correspondem aos seus critérios, os dois últimos exemplos vencem: demo1 . Se desses 100 mil registros eu fizer 28 mil corresponderem a isso, o primeiro exemplo se torna mais rápido: demo2 .Certifique-se de executar seus próprios benchmarks e ajustar sua abordagem.