Ir para conteúdo

POWERED BY:

Arquivado

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

BRG

Remover Registros Duplicados

Recommended Posts

Boa tarde pessoal!

Estou com um problema e espero que alguém possa me ajudar.

 

Possuo uma tabela de responsabilidade e nela possuo diversos registros duplicados como exemplo:

 

ID | ID_USUARIO | ID_TAREFA

1 | 1 | 1

2 | 2 | 2

3 | 3 | 2

4 | 3 | 2

5 | 4 | 3

 

Notem que posso ter registros de usuarios ou tarefas repetidos. O que não pode acontecer, é a compinação usuario/tarefa se repetir, como acontece nos ID 3 e 4

Eu tenho um sql que localiza todos os registros que aparecem mais de uma vez:

 

SELECT id_tarefa, id_usuario, COUNT( * ) AS Total

FROM responsavel

GROUP BY id_tarefa, id_usuario

HAVING Total >1

 

O resultado deste SELECT é

 

ID_TAREFA | ID_USUARIO | TOTAL

3 | 2 | 2

 

Pois bem, não consigo remover o registro duplicado e deixar apenas 1.

Lembrando, tenho milhares de duplicações o que impede que eu faça isso manualmente.

 

Li diversos tutoriais na net, como duplicar a tabela ou deixar um campo como UNIQUE, porém como disse eu posso ter esses registros duplicados, o que não posso ter é a combinação USUARIO/TAREFA duplicadas.

 

Se alguém puder me ajudar, ficarei imensamente agradecido!

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obtendo os duplicados

 

SELECT ID_USUARIO , ID_TAREFA
FROM TABELA
GROUP BY ID_USUARIO , ID_TAREFA
HAVING COUNT(*) > 0

 

Lista total

 

SELECT ID , ID_USUARIO , ID_TAREFA
FROM TABELA
WHERE (ID_USUARIO , ID_TAREFA) IN
(
SELECT ID_USUARIO , ID_TAREFA
FROM TABELA
GROUP BY ID_USUARIO , ID_TAREFA
HAVING COUNT(*) > 0
)
ORDER BY 2,3,1

 

Pode-se fazer uma Procedure com esta query num cursor,que vai :

 

ignorar o primeiro registro de cada par ID_USUARIO/ID_TAREFA
deletar os demais de cada par ID_USUARIO/ID_TAREFA

 

O segundo passo é criar uma constraint de PK ou unique para este par na tabela, o problema não voltará a

ocorrer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, primeiramente muito obrigado pela ajuda!

A última parte que é criar uma constraint de PK ou unique eu não entendi muito bem.

Eu consigo criar um UNIQUE para uma combinação de 2 campos da tabela, no caso ID_TAREFA+ID_USUARIO?

 

Abraço!

 

Obtendo os duplicados

 

SELECT ID_USUARIO , ID_TAREFA
FROM TABELA
GROUP BY ID_USUARIO , ID_TAREFA
HAVING COUNT(*) > 0

 

Lista total

 

SELECT ID , ID_USUARIO , ID_TAREFA
FROM TABELA
WHERE (ID_USUARIO , ID_TAREFA) IN
(
SELECT ID_USUARIO , ID_TAREFA
FROM TABELA
GROUP BY ID_USUARIO , ID_TAREFA
HAVING COUNT(*) > 0
)
ORDER BY 2,3,1

 

Pode-se fazer uma Procedure com esta query num cursor,que vai :

 

ignorar o primeiro registro de cada par ID_USUARIO/ID_TAREFA
deletar os demais de cada par ID_USUARIO/ID_TAREFA

 

O segundo passo é criar uma constraint de PK ou unique para este par na tabela, o problema não voltará a

ocorrer.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Eu consigo criar um UNIQUE para uma combinação de 2 campos da tabela, no caso ID_TAREFA+ID_USUARIO?

 

sIM

 

CREATE INDEX IDX_TABELA ON TABELA (ID_TAREFA,ID_USUARIO);

 

Veja o manual para mais detalhes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.