Estou usando esta instrução para inserir registros de outra tabela:
SQL> insert into city(city_code, country_code, city)
select distinct(city_code), country_code, city_name
from airport_final;
2 3
9012 rows created.
Encontrei muitos registros duplicados:
SQL> SELECT city_code, COUNT(city_code)
FROM airport_final
GROUP BY city_code
HAVING COUNT(city_code) > 1;
VRA 2
WBU 3
YMQ 4
YPR 2
330 rows selected.
Não sei se estou selecionando registros distintos, mas por que está inserindo duplicatas
Atenciosamente
DISTINCT
opera em toda a linha (todas as colunas listadas), não em uma coluna, portanto não pode ser usado para obter exclusividade em apenas uma coluna.Você precisa
GROUP BY
da chave que pretende ser única e usar algum tipo de função de agregação nos outros atributos:Algo semelhante pode ser feito com funções de janelas, como
ROW_NUMBER
as quais você garante que todos os atributos não-chave sejam obtidos da mesma linha, seguindo qualquer lógica de prioridade que você deseja implementar naORDER BY
cláusula:Na realidade, você provavelmente tem dados sujos com divergências sobre o nome da cidade e/ou país que cada código de cidade representa. Você se deparará com o problema de decidir qual associação é correta e qual não. No exemplo acima, peguei apenas o nome da cidade com classificação alfabética mais baixa, mas a lógica apropriada pode ser bem diferente. Isso dependerá de você e de seus dados. Mas você tem que fazer algo para escolher entre as diferentes associações se quiser uma tabela digitada por código de cidade. Você pode achar impossível fazer isso com o código e, em vez disso, ter que colocá-lo no Excel e remover manualmente as entradas incorretas, limpando-o usando a inteligência humana. Embora isso seja lamentável, é uma lição aprendida sobre o que acontece quando as regras de normalização não são seguidas.