Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
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.
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.
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.