segunda-feira, abril 16, 2007

Mais um pouco de SQL BÁSICO!!!

Dae pessoal, tudo bele?
Hoje vi um post em uma lista de MySQL de alguém querendo saber como checar registros repetidos em uma tabela. Bom a solução mais simples, clara, NO GAMBI é o uso do HAVING (contendo).

E então criemos a tabela de testes (jogo rápido!):

CREATE TABLE DADOSREPETIDOS (ID INT, NOME VARCHAR(200));

Agora vamos popular (tá, minha criativida é f*** mesmo, não pensei em nada melhor do que meia dúzia de personagens de TV :D):

INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(1, 'John Due');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(2, 'Martha Kent');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(3, 'Nick Stokes');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(4, 'Scooby Doo');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(5, 'Bart Simpson');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(6, 'Clhoe Sullivan');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(7, 'Gil Grisson');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(8, 'Warrick Brown');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(9, 'Rachel Bilson');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(10, 'Clark Kent');
/* OS REPETIDOS */
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(11, 'John Due');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(12, 'Nick Stokes');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(13, 'Rachel Bilson');
INSERT INTO DADOSREPETIDOS (ID, NOME) VALUES(14, 'Bart Simpson');

E finalmente vamos selecionar os registros repetidos:

  SELECT COUNT(*), d1.Nome
    FROM JEAN.DADOSREPETIDOS d1
GROUP BY d1.Nome
  HAVING COUNT(*) > 1

Resultado da query:

+----------+---------------+
| COUNT(*) | Nome          |
+----------+---------------+
|        2 | Bart Simpson  |
|        2 | John Due      |
|        2 | Nick Stokes   |
|        2 | Rachel Bilson |
+----------+---------------+
4 rows in set (0.00 sec)



Beleza, essa é a maneira mais rápida de se procurar por registros iguais em uma tabela. Sendo que ele pega somente a primeira ocorrência, CUIDADO ao deletados se for fazer isso... as vezes, para não quebrar uma sequência por exemplo, é preferivel deletar os posteriores.

Espero ter ajudado.

Ajudem o blog aí pessoal prestigiando os nossos anunciantes :D.

5 comentários:

Anônimo disse...

Olá,

Gostei, desculpe e ignorância, mas qual seria a solução elegante já que está é a mais simples(GAMBI)?

Valeu.

Jean Michel disse...

Essa! :P

Olha o que eu escrevi:

"Bom a solução MAIS simples, clara, NO (de não) GAMBI é o uso do HAVING..."

A maneira de fazer isso mais amadora (que eu vi por aí) foi em procedures dois cursores batendo as linhas... insano e perigoso! Usa o HAVING, o cara que inventou o SQL agradece hehehe :P

Continue vindo ao blog e comentando, fico grato!

Abraço

Wilter disse...

blz a dica funciona, mas tenho um problema parecido. preciso exibir em um relatório os registros duplicados e não apenas contá-los. Como ficaria?

Wilson GArcia disse...

Sei que este POST já é um tanto antigo, mas não encontrei nada ma WEB que pudesse me ajudar...
Tenho em uma tabela os campos id, asc1, asc2, asc3 e asc4, preciso retornar os dados repetidos que apareçam nos 4 campos ( asc1, asc2, asc3 e asc4) por exemplo: 13 - 6 vezes, 19 - 14 vezes, 36 - 9 vezes. Pergunto... É possível?

Jean Michel disse...

Wilson, não entendi a sua dúvida.

Tu queres fazer:

SELECT COUNT(asc1), COUNT(asc2)...

???