bom dia a todos, estou limpando uma tabela com registros duplicados.
Pela falta de estrutura da tabela, e por se tratar de uma tabela de acessos não faremos alterações no software, sendo assim montei o seguinte script para verificar acessos dulpicados:
DDL – Tabela:
create table OPCUSUARIO
(
usuario VARCHAR2(20),
opcao VARCHAR2(40),
menu VARCHAR2(20),
user_name VARCHAR2(30) default USER,
datcad DATE default SYSDATE
)
SQL – Consulta:
select op1.usuario,op1.opcao, op1.menu, count(*) from lll.opcusuario op1
where exists (
select count(*) from lll.opcusuario op
where op1.usuario = op.usuario
and op1.opcao = op.opcao
and op1.menu = op.menu
having count(*) > 1
group by op.usuario,op.opcao, op.menu
)
and op1.rowid <> (
select max(op2.rowid)
from lll.opcusuario op2
where op1.usuario = op2.usuario
and op1.opcao = op2.opcao
and op1.menu = op2.menu
)
having count(*) > 1
group by op1.usuario,op1.opcao, op1.menu;
Quando a manutenção nos dados foi com intervalos de datas, aparece normalmente, porem quando é manutenção em lote, e o rowid fica com pouca diferença o MAX retorna 2 linhas:
MAX(O.ROWID)
1 AAAPujAAFAABmzzABY
2 AAAPujAAFAABmzzABZ
Neste caso, o MAX está retornando as duas linhas, a com final ‘Y’ e ‘Z’..
isto é correto, se tratando de rowid?, alguma sugestão para a consulta das duplicações, sendo que é necessário mostrar todas as linhas duplicadas, deixando apenas 1 para que o acesso não seja perdido. (Por isso do rowid != do max(rowid), ficando apenas 1 linha)..
Obrigado