quinta-feira, 3 de novembro de 2016

Como excluir itens duplicados em bases de dados Firebird.

Neste exemplo vamos usar uma tabela chamada "duplicado".


DDL para criação da tabela:


CREATE TABLE duplicado(
  id      INTEGER,
  codigo  INTEGER,
  senha   INTEGER,
  nome    VARCHAR(100)
);


Inserção de dados na tabela


INSERT INTO duplicado (id, codigo, senha, nome)
   VALUES(1,1,1,'Lucas');

INSERT INTO duplicado (id, codigo, senha, nome)
   VALUES(2,2,2,'Yudi');

INSERT INTO duplicado (id, codigo, senha, nome)
   VALUES(3,1,2,'João');


Verificar os dados que foram inseridos:


SELECT * FROM duplicado;



Os códigos dos registros 1 e 3 estão duplicados(valor = 1), abaixo temos uma consulta para verificar os dados que estão duplicados:


SELECT codigo, Count(*) FROM duplicado
  GROUP BY codigo
  HAVING Count(*) > 1;



Encontramos o código 1 por duas vezes.




Bloco de execução para encontrar e deletar os dados duplicados:


EXECUTE block AS

     DECLARE variable var_id int;

     DECLARE variable var_codigo int;

  BEGIN
    for
    SELECT max(id) AS id, codigo
      FROM duplicado
         GROUP BY codigo
      HAVING count(*) > 1
      INTO :var_id,:var_codigo

         do DELETE FROM duplicado
      WHERE id = :var_id
        AND codigo = :var_codigo;
      end


Novamente a consulta para encontrar os dados duplicados:


SELECT codigo, Count(*) FROM duplicado
   GROUP BY codigo
   HAVING Count(*) > 1;



O retorno da consulta agora é nulo.



Consulta em todos os registros da tabela:


SELECT * FROM duplicado;





O registro com o "id" 3 que tinha o mesmo código do registro com "id" 1 foi deletado, para excluir itens com chaves mais complexas basta adicionar novas variáveis ao bloco de execução.