Usuário com melhor resposta
Apagar registros repetidos

Pergunta
-
pessoal, eu tenho uma query que serve para apagar registros duplicados em minha tabela. ele faz da seguinte forma:digamos que eu tenha a tabela TABLE, com COD1 e COD2, desta forma:TABLE______________COD1 COD21 21 31 22 1bom o script serve para ver se na tabela existem registros com os dois campos repetidos, no caso ele apagaria o seguinte regsitro: COD1 - 1 e COD2 - 2, que se repetem duas vezes na tabela. entenderam? bom a minha query é assim:WITH T1 AS (SELECT ROW_NUMBER ( ) OVER (PARTITION BY TABLE.COD1, TABLE.COD2 ORDER BY TABLE.COD1) AS RNUM FROM TABLE) DELETE FROM T1 WHERE RNUM > 1funciona beleza, mas agora preciso adaptar isso para o SQL 2000, já que não dá pra usar o ROW_NUMBER( ).alguém tem alguma idéia de como fazer?agradeço desde já...
Respostas
-
pessoal, eu fiquei remoendo esse problema agora e fiz um cursor pra resolver o problema...Declare @COD1 int, @COD2 int, @QTD numeric, @SQL varchar(1000)Declare Cur Cursor For Select COD1, COD2, Count(*) - 1 As QTD From TABLE Group By COD1, COD2 Having Count(*) > 1Open CurFetch Next From Cur Into @COD1, @COD2, @QTDWhile @@Fetch_Status = 0BeginSet @SQL = 'Delete Top (' + Cast(@QTD As varchar(10)) + ') From TABLE Where COD1 = ' + Cast(@COD1 As varchar(10)) + ' And COD2 = ' + Cast(@COD2 As varchar(10))Exec (@SQL)Fetch Next From Cur Into @COD1, @COD2, @QTDEndClose CurDeallocate Curse alguém tiver uma solução melhor, por favor... obrigado...
-
Anderson,
Cuidado em relação a permissão para utilizá-las vai depender da maneira que você deseja aplicar este tipo de funcionalidade, lógicamente uma variável do tipo table estará ocupando o espaço de memória do seu SQL Server, como também estará consumindo recursos do seu TempDB.
É um tipo de dados especial que pode ser usado para armazenar um conjunto de resultados para processamento posterior. table é utilizado principalmente para o armazenamento temporário de um conjunto de linhas retornadas como o conjunto de resultados de uma função com valor de tabela.
As consultas que modificam variáveis table não geram planos de execução de consulta paralelos. O desempenho pode ser afetado quando variáveis table muito grandes ou variáveis table em consultas complexas, forem modificadas. Nessas situações, considere o uso de tabelas temporárias em seu lugar.
-
Olá Anderson,
Não há nenhum impeditivo para declarar variáveis do tipo table. Assim como as tabelas temporárias, qualquer usuário poderá criá-las. É exatamente como criar uma variável normal.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Todas as Respostas
-
pessoal, eu fiquei remoendo esse problema agora e fiz um cursor pra resolver o problema...Declare @COD1 int, @COD2 int, @QTD numeric, @SQL varchar(1000)Declare Cur Cursor For Select COD1, COD2, Count(*) - 1 As QTD From TABLE Group By COD1, COD2 Having Count(*) > 1Open CurFetch Next From Cur Into @COD1, @COD2, @QTDWhile @@Fetch_Status = 0BeginSet @SQL = 'Delete Top (' + Cast(@QTD As varchar(10)) + ') From TABLE Where COD1 = ' + Cast(@COD1 As varchar(10)) + ' And COD2 = ' + Cast(@COD2 As varchar(10))Exec (@SQL)Fetch Next From Cur Into @COD1, @COD2, @QTDEndClose CurDeallocate Curse alguém tiver uma solução melhor, por favor... obrigado...
-
Boa Tarde,
Se houver alguma outra coluna é possível fazer via um único comando de DELETE.
Senão houver outra possibilidade é utilizar uma tabela temporária. Ex:
Code Snippetdeclare
@t table (cod1 int, cod2 int)insert
into @t values (1,2)insert
into @t values (1,3)insert
into @t values (1,2)insert
into @t values (2,1)-- Insere os registros duplicados distintamente em outro local
select
cod1, cod2 into #t from @tgroup
by cod1, cod2having
count(*) > 1-- Delete os registros duplicados (todos)
delete
from @tfrom
@t as tinner
join (select
cod1, cod2 from @tgroup
by cod1, cod2having
count(*) > 1) as qon
t.cod1 = q.cod1 and t.cod2 = q.cod2-- Reinsere os registros distintamente
insert
into @t (cod1, cod2)select
cod1, cod2from
#tselect
* from @tdrop
table #t[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-
baseado na tua idéia, fiz da seguinte forma:Declare @TABELA table(COD1 int, COD2 int)Insert Into @TABELA(COD1, COD2) Select COD1, COD2 From TABLE Group By COD1, COD2Delete From TABLEInsert Into TABLE(COD1, COD2) Select COD1, COD2 From @TABELAGOfunciona também
-
-
Anderson,
Cuidado em relação a permissão para utilizá-las vai depender da maneira que você deseja aplicar este tipo de funcionalidade, lógicamente uma variável do tipo table estará ocupando o espaço de memória do seu SQL Server, como também estará consumindo recursos do seu TempDB.
É um tipo de dados especial que pode ser usado para armazenar um conjunto de resultados para processamento posterior. table é utilizado principalmente para o armazenamento temporário de um conjunto de linhas retornadas como o conjunto de resultados de uma função com valor de tabela.
As consultas que modificam variáveis table não geram planos de execução de consulta paralelos. O desempenho pode ser afetado quando variáveis table muito grandes ou variáveis table em consultas complexas, forem modificadas. Nessas situações, considere o uso de tabelas temporárias em seu lugar.
-
Olá Anderson,
Não há nenhum impeditivo para declarar variáveis do tipo table. Assim como as tabelas temporárias, qualquer usuário poderá criá-las. É exatamente como criar uma variável normal.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
-