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