Bom pessoal, sou novo em SQL e me deparei com uma procedure um tanto quanto diferente …
vou tentar ser o mais claro possível.
Preciso eliminar algumas duplicidades no BD… mas para saber se o dado é duplicado ou não tenho que fazer 3 comparações …
selecionar todos os itens que são ‘OK’ ( simples, basta colocar na clausula where status = ‘OK’ )
mas o problema vem agora, as outras duas comparações são feitas a partir do próprio registro :?
pegar dois campos que compõe o item e comprar se os demais itens tem o mesmo valor EX:
campo 1: X
campo 2: Z
então procurar por itens que sejam ‘OK’ e tem os mesmos valores X e Z nos campos ( lembrando que esse valor não pode ser fixo na clausula where pq a cada linha os registros tem os valores dos campos 1 e 2 diferentes ). E por ultimo ! como se não bastasse !
essa comparação só pode ser feita com itens que tenham 15 sec de diferença a partir de um terceiro campo. EX:
campo 3: 31/11/2012 00:12:45 ( pegar itens que essa data seja até 31/11/2012 00:13:00 )
no final de tudo, se existir mais que um registro que esses três itens batem, devo excluir e deixar apenas um !
se alguém souber como faço essa procedure favor me dar pelo menos uma luz ! kkkkkkk
SELECT item_codigo FROM itens it
WHERE item_status = 'OK' AND (SELECT COUNT(*) FROM itens it2 WHERE it2.x = it.x AND it2.y = it.y AND it2.item_valor = it.item_valor AND it2.item_data BETWEEN it.item_data AND DATEADD(Seconds,item_data) ) > 1
[color=red] LEMBRANDO QUE ISSO É A LOGICA [/color]
Agora você teria que passar para o seu banco de dados a query usando os campos e funções especificas .
Acho que entendi, mas ainda estou um pouco confuso. Seus objetos de dados tem um ID, CODIGO algo assim? e eles são sequenciais? Caso sim, porque não tenta pegar sempre o próximo e comparar?
sim, eles possuem ID, porééém esses itens são salvos no BD a partir de uma exportação de uma base de dados onde lá, eles não tem ordem nenhuma e tem alguns que vem repetido…
o que tenho que fazer é excluir esses repetidos …
e em relação ao item 3, existe uma função no mysql que chama TIMEDIF, acho que essa função resolve meu problema porém esse TIMEDIF teria que ser de acordo com cada registro
até pq, vou excluir os itens repetidos de acordo com ID
Isso é muito relativo pois depende muito da sua aplicação como por exemplo, ela possui acesso simultaneo de usuarios?. Ou seja, havera varios usuarios inserindo itens na mesma tabela simultaneamente? caso sim levar em conta a identidade do registro do item pode não ser valido, pois dependendo da situação um usuario pode inserir 1 item no mesmo tempo de outro, a diferença pode ser de milesegundos mas o codigo não sera sequencial ou tambem se voce utiliza apenas uma transação para a inserção dos itens ou ate mesmo o proprio relacionamento das tabelas.
Com isso o certo é você analisar e verificar quais campos identificam um registro duplicado para conseguir recuperar.
O exemplo que eu dei não utiliza um campo ID pois eu levei em conta que o que definia um registro duplicado eram os campos x y e valor.
tioola, seu exemplo vai servir certinho, porém com ele, eu identifico quantos dados estão duplicados … mas como faço pra pegar o ID dos dados que estão duplicados para poder exclui-los ?
Os itens não possuem um campo IDENTITY?
Caso não possua você tera que dar um ALTER TABLE, e inserir um campo IDENTITY com qualquer nome e com a propriedade AUTO INCREMENT na tabela de itens, assim cada registro tera um codigo de identidade sequencial e voce conseguira pegar os codigos.