Pular para o conteúdo
Visualizando 1 post (de 1 do total)
  • Autor
    Posts
  • #96679
    leandrolbs
    Participante

      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

    Visualizando 1 post (de 1 do total)
    • Você deve fazer login para responder a este tópico.