BRG 2 Denunciar post Postado Junho 28, 2011 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
Motta 645 Denunciar post Postado Junho 28, 2011 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
BRG 2 Denunciar post Postado Junho 28, 2011 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
Motta 645 Denunciar post Postado Junho 28, 2011 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