quinta-feira, 6 de maio de 2010

Mais furos no SQL

A primeira solução para encontrar espaços na numeração de uma chave primária tinha um defeito: se não existisse registro para o primeiro número, todos os números até o registro mais baixo permaneceriam vagos.

Pode-se resolver a questão mudando um pouco a consulta. No lugar do olhar para frente, com LEAD(), olha-se para trás, com LAG().


select numero2+livre
from
(select numero numero1,
lag(numero, 1, 0) over (order by numero) numero2
from produtos) p1
inner join (select rownum livre from produtos) p2
on livre < numero1 - numero2
order by 1


Usei lag(numero, 1, 0), porque quero que a numeração comece com 1 (o segundo select usa rownum e este começa com 1).

Nenhum comentário: