Eliminar um dos registros com chave igual, campos diferentes

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
rsalbano
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 76
Registrado em: Seg, 11 Jul 2011 9:55 am
Localização: Curitiba

Olá,

Estou com a seguinte situação:
Tenho um arquivo (TXT) que vem várias informações do cliente.
Estou inserindo estas informações em uma tabela, onde a chave é CPF, tipo de pessoa e o código do cliente.
Ocorre que no mesmo arquivo pode haver mais de um registro com o mesmo cliente (cpf, tipo e codigo) iguais, mas com outras informações diferentes (telefone, estado cívil, etc), isso ocorre, pois neste arquivo vem todas as alterações realizadas nos dados do cliente.
Carrego as informações do arquivo TXT para um tabela e a partir desta tabela eu incluo na tabela de clientes.
O meu problema acontece quando neste arquivo, vem dois registros de um cliente novo. A procedure tenta inserir os dois registros acontecendo erro de chave duplicada. Estou usando MERGE.

Ex: cpf - tipo - codigo - nome - telefone
12345 - F - 12 - jose silva - 11332244
12345 - F - 12 - jose silva - 1133224455

O que acontece, o cliente foi incluído e depois foi alterado o telefone, no arquivo vai aparecer as duas linhas. Quando tendo inserir (MERGE) vai dar chave duplicada.
Eu não necessito do primeiro registro, pois a informação que será atualizada por último será a do segundo registro.

Como posso fazer para, quando existir dois registros de mesmo cliente, eu excluir o primeiro, ou seja, considerar somente o segundo registro.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

da pra fazer um subselect pegando sempre o max

presumo que deve ter uma data.. ou algum id, que você possa identificar qual o mais recente...
senao tem que fazer uma gambi pra usar o rownum, mas você deve ter alguma ordenacao ai pra saber qual o mais recente, então você se baseia nessa colnua pra pegar somente o ultimo registro...
select 1 from tabela a where dt_atualizacao = (select max(dt_atualizacao) from tabela b where a.nr_cpf = b.nr_cpf)

:D

veja aí se ajuda
rsalbano
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 76
Registrado em: Seg, 11 Jul 2011 9:55 am
Localização: Curitiba

Olá,

Não há campo que identifique o registro. A regra será que o último registro é o mais novo.
Como é um arquivo TXT, não tem nenhum campo que identifique cada linha.

ABraços,

Ricardo.
schnu
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 110
Registrado em: Ter, 24 Mai 2005 9:16 pm
Localização: Dongguan - Guangdong - China
Deus criou os loucos para confundir os sábios

acredito que você deveria carregar para uma tabela sem PK e a partir dela carregar sua tabela quente. Dai é so trabalhar um SQL que resolva teus problemas de duplicidade e pegar o ultimo carregado.
rsalbano
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 76
Registrado em: Seg, 11 Jul 2011 9:55 am
Localização: Curitiba

Olá,

Só agora estou retornando à este problema.
Eu carreguei os dados para uma tabela. Quando foi executar o merge, ele informa que a comparação retorna mais de uma linha. Tentei criar um cursor para ler cada linha da tabela, mas não consigo comparar as chaves.
Como eu poderia eliminar uma das linhas repetidas?

Abraços,
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Concordo com:
schnu escreveu:acredito que você deveria carregar para uma tabela sem PK e a partir dela carregar sua tabela quente. Dai é so trabalhar um SQL que resolva teus problemas de duplicidade e pegar o ultimo carregado.
você pode afazer agrupamento do CPF/CODIGO e nos campos que tiver informação multiplicada usar MIN ou MAX(já que você disse que não tem campo com data de ultima, e aparentemente não faz diferença excluir a 1 ou a 2).
Aí retornaria apenas uma linha para cada.
Responder
  • Informação