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.
Eliminar um dos registros com chave igual, campos diferentes
-
- 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)

veja aí se ajuda
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)

veja aí se ajuda
-
- 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.
-
- 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,
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,
-
- Moderador
- Mensagens: 641
- Registrado em: Seg, 03 Set 2007 3:26 pm
- Localização: Fortaleza - CE
att,
Daniel N.N.
Daniel N.N.
Concordo com:
Aí retornaria apenas uma linha para cada.
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).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.
Aí retornaria apenas uma linha para cada.
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante