SQL - DUVIDA PARA DELETAR REGISTROS

MICHAELL 25/09/2013 02:58:23
#429220
Olá Pessoal, tudo belezinha?
acredito que seja uma dúvida simples...

gostaria de saber como posso deletar todos os registros de uma tabela, mantendo apenas os ULTIMOS 100 registros cadastrados no banco utilizando access.

Delete * from Tabela where ??

TUNUSAT 25/09/2013 07:54:37
#429221
MAICONJG,


Você tem alguma chave de cadastramento da tabela tipo uma data de cadastramento ou um Autonumber?
Sabe como acessar algum ID interno (contador) da tabela de uso do Access?

Se não tiver:
Você pode tentar descobrir o número de registros da tabela e rodar uma rotina de deleção em alguma liguagem de programação com um looping deste número - 100. Mas sugiro que faça um backup antes de tentar.


[][ô]s,
Tunusat.
MICHAELL 25/09/2013 09:03:37
#429226
Citação:

:
MAICONJG,


Você tem alguma chave de cadastramento da tabela tipo uma data de cadastramento ou um Autonumber?
Sabe como acessar algum ID interno (contador) da tabela de uso do Access?

Se não tiver:
Você pode tentar descobrir o número de registros da tabela e rodar uma rotina de deleção em alguma liguagem de programação com um looping deste número - 100. Mas sugiro que faça um backup antes de tentar.


[][ô]s,
Tunusat.



Olá Tunusat,

tenho um autonumber chamado ID...

No access o contador seria assim: select count(*) from Tabela
seria assim que voce queria saber?


TUNUSAT 25/09/2013 09:25:12
#429228
MAICONJG,


Legal!
Se você tem este AutoNumber fica fácil.
Basta pegar o número total de registros na tabela e subtrair de [Ô]100[Ô]. O valor que ficar é o número de vezes que precisa fazer um looping.

Você pega seus registros na tabela usando um Order By este Autonumber. Sacou?
Você pode fazer assim também: Select Top X * Where ... O [Ô]X[Ô] é o número total de registros menos 100. Não esqueça de colocar o Order by. Dai os números mais altos (últimas entradas de registro) ficarão fora do Select.

Consegue montar a query de disparo?


[][ô]s,
Tunusat.
MICHAELL 25/09/2013 09:35:08
#429230
mas nesse caso teria que fazer um select primeiro, para saber o total de registro da tabela..
e depois um delete certo?

achei que haveria alguma maneira rapida em um sql apenas de excluir esses registros.
OMAR2011 25/09/2013 10:27:21
#429234
MAICONJG

Não existe tecnologia em programação para tal.
Para isto tinha que ter troca de informação entre
o SER que se diz humano e máquina.
TUNUSAT 25/09/2013 10:57:33
#429238
MAICONJG,

Calma! Não é tão difícil assim!
Veja este exemplo:

Criei uma tabela tblTeste dentro de um banco de dados Access.
Cadastrei 15 registros com dois campos:
- [Ô]Codigo[Ô] que é um campo Autonumber e Chave Primária;
- [Ô]Nome[Ô] que é um campo Texto;

======================
DELETE FROM tblTeste
WHERE Codigo IN
(SELECT TOP 5 Codigo
FROM tblTeste
ORDER BY Codigo ASC);
======================

O DELETE olha todos os códigos dentro da tabela que foram [Ô]separados[Ô] pelo SELECT em TOP [Ô]5[Ô] e devolve os código que devem ser deletados.

Próximo passo:

======================
SELECT Count(*)-5 AS Expr1 FROM tblTeste;
======================

A query acima devolve em [Ô]Expr1[Ô] a quantidade de registros da tabela - 5 (menos 5).

Agora não sei como juntar as duas querys... Mas deve ter um jeito! Se não tiver como você pode fazer a operação em dois passos:
1º) Colete a quantidade de registros usando a segunda query;
2º) Alimente a quantidade de registro manualmente na primeira query;

Se quiser testar no seu banco de dados TIRE UMA CÓPIA! Ou monte o exemplo que eu montei.


[][ô]s,
Tunusat.


[][ô]s,
Tunusat.
MICHAELL 25/09/2013 11:06:43
#429240
essa que seria a dúvida..

quero usar essa query para deletar os registro de uma tabela de HISTORICO de eventos do sistema.
quero manter no máximo os ultimos 100 eventos por exemplo.

mas preciso deletar todos mantendo os ultimos 100.

MICHAELL 25/09/2013 11:35:40
#429247
consegui fazer assim..


Set TBHistoricos = BancoDeDados.OpenRecordset([Ô]Select top 5000 H.* from Historicos H order by codigo_historico DESC[Ô])

TBHistoricos.MoveLast

If (Not TBHistoricos.EOF) Then
DB.Execute ([Ô]Delete from Historicos where codigo_historico < [Ô] & TBHistoricos!codigo_historico)
End If


porém, achei que haveria uma maneira mais simples e fácil.. em uma linha de fazer isso.


MICHAELL 25/09/2013 11:47:43
#429251
acredito que achei uma forma, usando uma subconsulta...


DELETE *
FROM Historicos
WHERE codigo_historico < (SELECT max(codigo_historico) - 100 FROM Historicos) as limite

ROBSON 25/09/2013 12:59:53
#429259
Imaginei o seguinte:

Capture o último ID criado, por exemplo: 5000.

Delete * From TabelaHistorico WHERE ID < 4900

Página 1 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas