2009/7/30 Tiago Adami <adam...@gmail.com>:
> Seguindo o raciocínio do nobre colega Fábio Ebner, tenho um problema que não
> consegui resolver de forma que não degrade a performance...
>
> Tenho uma tabela com 11 milhões de registros. Existe um campo que é um
> contador numérico, e é uma AK da tabela (contador de transação). Pois bem...
> eu gostaria de um SELECT que retornasse apenas os números que não estão
> nesta tabela em um intervalo de 1 a 11.000.000 (que é o total de registros).
> Se eu delimitasse o máximo até 10, seria assim:
> [Registros na tabela]
> 1
> 2
>    3 --> não existe
> 4
> 5
> 6
> 8
>    7 --> não existe
> 9
> 10
> (...)
>
> Até 10, os números que o select deveria retornar são:
> [Registros que não estão na tabela]
> 3
> 7
>
> Hoje eu uso um trigger que alimenta uma tabela auxiliar cada vez que um
> registro é eliminado. Isto é rápido, mas gostaria de saber se existe uma
> forma de criar uma função ou algo parecido que não use trigger e não seja
> muito demorado (considerando 11 milhões de registros).
>
> Desculpem a impertinência, mas alguém tem alguma sugestão melhor?
>


bdteste=# CREATE TEMP TABLE foo(num int);
CREATE TABLE
bdteste=# INSERT INTO foo VALUES (1),(2),(4),(5),(6),(8),(9),(10);
INSERT 0 8

bdteste=# SELECT x FROM (SELECT generate_series(1,10)) AS f(x) LEFT
OUTER JOIN foo ON (f.x = num) WHERE num IS NULL;
 x
---
 3
 7
(2 registros)

ou ainda:

bdteste=# SELECT generate_series(1,10) EXCEPT SELECT num FROM foo;
 generate_series
-----------------
               3
               7
(2 registros)

Osvaldo
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a