Ir ao conteúdo
  • Cadastre-se

Localizar duplicidade SQL


Erciley Junior

Posts recomendados

Olá, no banco de dados aqui da empresa, está por algum defeito do software, duplicando codigo com razao social diferente só que com cnpj igual, mas desconsiderem.

O que quero saber é como fazer um select assim:

mostre os campos onde CNPJ = CNPJ e ID != ID

ID é uma chave primaria, por isso nao tera duplicidade

na minha cabeça a nomenclatura seria:

select *

from clientes

where cnpj = cnpj and id != id

mas nao deu certo :/

como seria??

Link para o comentário
Compartilhar em outros sites

primeiro: nao tem logica essa sua query... você ta tipo pedindo... me mostre os registros onde 1 é igual a 1 e 2 é diferente de 2... 1 sempre vai ser igual a 1 e 2 nunca vai ser diferente de 2... mas calma... mas tenta isso aqui:

select ID,CNPJ from clientes group by ID,CNPJ having count(cnpj)>1

ele vai te retornar os registros onde o cnpj ta repetido...

Link para o comentário
Compartilhar em outros sites

obrigado pela ajuda, só q acho q nao esta muito certo, pois nao retornou nd com o cnpj (pode ser por nao ter duplicidade) e nem com um campo chamado loja, q esse sim tem uns 500 registros iguais, coloquei assim e nao retornou nd:

select * from clientes group by id,loja having count(loja)>1

qual a logica desse comando???

obrigado

Link para o comentário
Compartilhar em outros sites

a ideia aqui e o seguinte... ele vai pegar por exemplo o primeiro "loja" e vai comparando com o resto da tabela... no nosso caso se ele encontrar qualquer outro nome identico ele vai colocar no resultado... ou seja o resultado que você ve pode ser assim interpretado: os nomes abaixos aparecem mais de uma vez.

tente exatamente: Select LOJA from clientes group by loja having count(loja)>1

Link para o comentário
Compartilhar em outros sites

esse comando acima q você falou para eu colocar exatamente igual, retorna todos os dados q sao diferentes um do outro, ou seja, retorna apenas um cadastro da tabela q contenha a informacao "A", um que contem a informacao "B" e assim por diante (retorna ao todo 4 dados).

e nao os q a informacao repete.

Queria um select q retorne os cadastros q contenham um mesmo cnpj ou nesse caso acima, q contenha a mesma loja, q se desse certo, retornaria para mim a tabela inteira, pois tenho 4 lojas cadastradas dentro de 10.000 cadastros de clientes.

Obrigado.

Link para o comentário
Compartilhar em outros sites

nao amigo... o comando acima te retorna os nomes que foram usados em duas ou mais lojas... a operação Having count(column)>1 te retorna as elementos que aparecem mais de uma vez... exemplo:

coluna_1

a

2

3

6

gh

v

a

d

c

d

a

Select duplicados from t1 group by duplicados having count(coluna_1)>1 =

Duplicados

a

d

agora se você quer os cnpjs repetidos e so colocar em vez de loja a coluna cnpj

Link para o comentário
Compartilhar em outros sites

acho q entendi o q o comando faz

tenho 500 cadastros em cada uma das 4 lojas = 2000 cadastros

esse select só vai retornar os 4 primeiros duplicados q encontrar certo???

suponha q minha tabela seja a descrita abaixo:

nome cnpj

a-------1

b-------1

c-------2

d-------3

e-------4

f-------4

esse select só retornara

a-------1-------ou-------b-------1

e-------4-------ou-------f-------4

que sao os duplicados certo??

certo???

Link para o comentário
Compartilhar em outros sites

P:esse select só vai retornar os 4 primeiros duplicados q encontrar certo???

R:Nao... para fazer isso adicione TOP 4 (Select TOP 4 * bla bla bla)

P:esse select só retornara que sao os duplicados certo??

R:Select Nome from t1 group by nome having Count(CNPJ)>1 ||| Retorna a & b & e & f

Select CNPJ from t1 group by CNPJ having Count(CNPJ)>1 ||| Retorna 1 & 4

Link para o comentário
Compartilhar em outros sites

Cara, se voce colocar o select assim:

Select * from clientes group by estado having Count("qualquer campo")>1

ele retorna 1 registro de cada estado, ou seja retorna apenas 27 registros (que é o total de estados do Brasil), e na frente do count, independente do campo q voce por, ele sempre retorna o mesmo resultado.

O que eu quero é:

se na minha tabela tivesse 28 registros repetindo apenas o estado de SP, queria que o select só retornasse os 2 registros que sao "DUplicados" que seria os que tem estado = SP

Link para o comentário
Compartilhar em outros sites

ta... você ta me deixando sem paciencia... alguma vez eu falei pra você colocar "*"??? para de colocar a droga do *... se você quer todos os campos... escreve todos os campos... segundo: "Select * from clientes group by estado having Count("qualquer campo")>1" nao retorna sempre a mesma coisa independente de o que seja "qualquer_campo" quer uma prova?

Begin Transaction

delete from clientes where estado Like "%sao paulo%"

Select * from clientes group by estado having Count("qualquer campo")>1

roda esse script ae... nao vai aparecer sao paulo, para desfazer:

ROLLBACK

entenda que quando você manda: Group BY o seu sgbd vai AGRUPAR por estado... estaria errado se ele te retornasse 30 registros...

Link para o comentário
Compartilhar em outros sites

Agradeço voce estar tentando me ajudar, só que acho que voce nao entendeu o que quero.

Por causa do problema de registros duplicarem "Do nada" ou seja, tenho a firma A e a Firma B, a firma B mantem seu nome no registro, só que copia todos os outros dados da firma A, então gostaria de rodar um select para ver no cadastro de clientes, se existe duas firmas com o mesmo cnpj e mostrar na tela todos os dados de ambas as firmas, para que eu possa analisar qual o real e qual o registro "danificado".

Testei todos esses selects que você postou e nao deu certo (rodou normal, mas nao imprimindo o que preciso).

Estou aqui no forum para pedir ajuda e nao para ficar discutindo, agradeço muito tua ajuda, se voce souber fazer isto que eu falei agora e puder postar aqui eu agradeço, e caso nao tenho expresso bem meu problema, me fale.

Obrigado.

Link para o comentário
Compartilhar em outros sites

velho você pode ir em qualquer lugar ou em qualquer livro... se você perguntar como eu faço para descobrir se eu tenho uma informação repetida no meu banco de dados (como o seu cnpj) eles vão virar para você e vão mandar você usar o having count(coluna)>1... faz o seguinte... posta ae a descrição da sua tabela completa tipo:

Tabela1:ID(PK,int),nome(varchar),endereço(varchar),CNPJ(int),bla bla bla ai eu vou fazer a query certinha pra você...

Link para o comentário
Compartilhar em outros sites

você ta falando serio que essa imagem da esquerda é uma tabela só?!?!? amigao... estuda banco de dados... serio mesmo... essa tabela ai pode ser quebrada em no minimo 5 outras... o que facilitaria MUITO o trabalho/processamento...

detalhe: a query nao é Count("ID")... é COUNT(ID) sem aspas

e como eu prometi:

Select ID from [sUA TABELA] group by ID having Count(CNPJ)>1

a unica coisa que você vai fazer e substituir o [sUA TABELA] pelo nome oficial da sua tabela... mais nada... o resto e CTRL+C CTRL+V

Link para o comentário
Compartilhar em outros sites

cara... testei esse comando seu aqui na facul e agora caiu minha ficha... aqui eu criei uma tabelinha pequena duplicando apenas o nome. e com o seu select, Select duplicados from t1 group by duplicados having count(coluna_1)>1, retornou apenas um aluno que é o duplicado, o q eu tenho q fazer é dar um select sei o que where campo like blablabla...

valeu mesmo... mas acho q no trampo dava diferente mas vou testar amanha cedo e posto de novo... mas muito obrigado por enquanto.

testei aqui no servico e deu certo sim... malz ae cara... é q eu tava pensando

que o comando retornaria assim:

nome 1----cnpj 01

nome 2----cnpj 01

mas ele só retorna um deles, dai voce tendo que fazer outro select, mas ja ajuda muito

valeu mesmo

Link para o comentário
Compartilhar em outros sites

este select fez travar duas vezes meu banco.. nao retorna erro nem nada, é como se ficasse num loop infinito, tive q encerrar o servico do mysql para as estacoes voltarem a funcionar.

Mas com o outro select deu certo:

SELECT qqcoisa FROM `tabela`group by qqcampo having count(qqcampo)>1

Dai com esse retorno, faço o select abaixo.

select * from tabela where qqcampo = "blablabla"

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!