ENCONTRAR [Ô]BURACO[Ô] NO AUTO-CONTADOR

MARCIO.TEIXEIRA 18/02/2010 11:01:12
#334674
Bom dia,

Estou precisando encontrar em uma tabela quais registros estão faltando, exemplo:

Tabela Movimento
ID Cliente Endereco
1 Marcio Rua X
2 Eduardo Rua Y
4 Maria Rua Z
5 Ana Rua A

Como faço para descobrir que o registro 3 não existe na tabela?

Queria resolver isso por SQL.
CLEVERTON 18/02/2010 11:04:17
#334676
Olha, não acho a idéia interessante, isso pode te causar alguns transtornos se caso ocorra algum erro e os registros da tabela filha não forem excluido,

esquece isso!
MARCIO.TEIXEIRA 18/02/2010 11:09:44
#334678
Mas eu não vou fazer nada, eu só quero saber quais registros estão faltando...

Eles já não existem na tabela, é que eu não queria ter que fazer um select full na tabela e colocar em um loop pra descrobrir os buracos...

Hoje o sistema que trablho gera log txt de tudo que faz no BD, aí eu preciso efetuar uma pesquisa e tentar descobrir o porque está faltando algum registro.

Essa consulta vai ser apenas uma ferramenta para descobrir oque está acontecendo
ASHKATCHUP 18/02/2010 11:23:31
#334682
Resposta escolhida
Talvez:


Select
ID
From
Movimento As A
Where
Not Exists (Select 1 From Movimento As B Where B.ID = (A.ID -1))
SINKERTEC 18/02/2010 11:26:50
#334683


Cara....via SQL creio q n seja possível n

O q se pode fazer é um POG (Programação Orientada a Gambiarra)

DIm Tabela as RecordSet

Set Tabela = Banco.OpenRecordset ([Ô]Select Max(id) AS MaxCod From SuaTabela[Ô])

For X = 1 to Tabela!MaxCod

Set Tabela = Banco.OpenRecordset ([Ô]Select ID From SuaTabela Where ID = [Ô] & X & [Ô] [Ô])

If Tabela.EOF = TRUE then List1.Additem X

Next X
MARCIO.TEIXEIRA 18/02/2010 11:34:56
#334685
Então ... via programação dá pra fazer... é que eu queria criar somente um script... e passar para os analistas

a consulta que o ASHKATCHUP passou é quase isso, é que ela retornar sempre o primeiro registro após o buraco, já ajuda...

tava procurando na internet e no postgre tem um comando genarete_series e seria justamente esse comando que eu queria só que no Oracle
DANIKULL 18/02/2010 12:41:44
#334690
MARCIO_TEIXEIRA, boa atrde.

Uma ideia baca, seria você criar uma tabela temporaria contendo somente o ID da tabela principal com [Ô]todos os registos[Ô] do 1º ao útimo, mais ou menos assim:

-> 1, 2, 3, 4, 5, 6,..., Último.

Depois você faz um consulta selecção de comparação entre a tabela Real e a tabela temporaria. Está é a única alternativa que vejo para você via sql, ok???
MARCIO.TEIXEIRA 18/02/2010 14:22:57
#334705
Achei o que eu queria, segue a solução

select *
from (with data as (SELECT rownum result
FROM Dual
CONNECT BY level <= 684842)
select result
from (select rownum my_row, result from data order by result)
where my_row between 684816 and 684842) a
where not exists
(Select 1 From movimento B Where B.codigo = (A.result))
Tópico encerrado , respostas não são mais permitidas