quinta-feira, 3 de julho de 2008

Resolvendo Chaves Duplas

Voce que trabalha com banco de dados deve ter se deparado algumas vezes com uma tabela com inumeros registros duplicados. Voce precisa excluir os registros duplos porém não há select possivel que possa trazer todos menos um para que voce possa excluir. Não é uma tarefa simples e faze-lo um a um, depedendo da quantidade de registros na tabela, se torna inviável.

O script abaixo, escrito para rodar no Oracle resolve esta questão, ou pelo menos, te coloca no caminho da solução.

DECLARE vSEQ INTEGER;

BEGIN
vSEQ := 0;
FOR REC IN ( SELECT NRBEM, NRINC FROM TPT21011 )
LOOP
vSEQ := vSEQ + 1;
UPDATE TPT21011 SET SEQ = vSEQ
WHERE NRBEM = rec.NRBEM AND NRINC = rec.NRINC AND ROWNUM = 1;
vSEQ := vSEQ + 1;
UPDATE TPT21011 SET SEQ = vSEQ
WHERE NRBEM = rec.NRBEM AND NRINC = rec.NRINC AND SEQ IS NULL;
END LOOP;
END;

DECLARE vNRBEM INTEGER;
vNRINC INTEGER;
BEGIN
FOR REC IN ( SELECT NRBEM, NRINC, SEQ FROM TPT21011 ORDER BY SEQ )
LOOP
IF rec.NRBEM <> vNRBEM AND rec.NRINC <> vNRINC THEN
DELETE FROM TPT21011 WHERE SEQ = ( SELECT MIN( SEQ ) FROM
TPT21011 WHERE NRBEM = rec.NRBEM AND NRINC = rec.NRINC );
END IF;
vNRBEM := rec.NRBEM;
vNRINC := rec.NRINC;
END LOOP;
END;


Até a proxima.


Reginaldo


Nenhum comentário: