SQL объединить таблицы, но исключить дубликаты, где совпадают все столбцы, кроме 1 - PullRequest
0 голосов
/ 28 февраля 2020

У меня небольшой опыт работы с SQL, и мне нужно объединить таблицы с множеством повторяющихся записей. Я довольно долго искал ответ, и наиболее близким к моей проблеме было следующее:

объединить две разные таблицы и удалить дублирующиеся записи

Он предложил это код, чтобы сопоставить таблицы по их именам и столбцам почтовых индексов.

INSERT INTO TABLE1
SELECT * FROM TABLE2 A
WHERE NOT EXISTS (SELECT 1 FROM TABLE1 X 
                  WHERE A.NAME = X.NAME AND 
                  A.post_code = x.post_code)

Моя единственная проблема в том, что у меня есть десятки столбцов и я не хочу выписывать их все. По сути, мне нужно удалить дубликаты, в которых ВСЕ столбцы одинаковы, КРОМЕ столбца даты и времени.

(дубликаты, введенные в разное время, поэтому даже если значение в столбце даты и времени отличается, для меня это все еще дубликат.)

Есть ли способ присоединиться к таблицам, но удалить дубликаты, если все столбцы, кроме 1, совпадают?

Обновление:

Большое спасибо за ответ ! Я, вероятно, сделал это неправильно, но теперь я получаю SQL ошибку, потому что слишком много столбцов:

создать уникальный индекс unq_audi_all_columns для audi_all (Vehicle, listed Price, Anunciante, Marca , Modelo, Série, Versão, Combustível, Mês de Registo, Ano de Registo, Quilómetros, Cilindrada, Potência, Valor Fixo, Aceita retoma, Possibilidade de financiamento, Segmento, Cor, Tipo de Caixa, Número de Mudanças, Nº de portas, Lotação, Classe do veículo, Tracção, Garantia de Stand (incl. no preço), Registo(s), Livro de Revisões completo, Não fumador, 2º Chave , Jantes de Liga Leve, Ar Condicionado, Condição, Inspecção válida até, Origem, Estofos, Numero de Airbags, Metalizado, Garantia mecanica fabricante até, Filtro de Particulas, Tecto de Abrir, Medida Jantes de Liga Leve, VIN, IVA dedutível, Emissões CO2, IUC, ou até, Matrícula, Consumo Combinado, Autonomia Máxima, Consumo Urbano, Consumo Extra Urbano, Capota, Capota Eléctrica, Clássico , Salvado, Valor sem IUC, Valor sem ISV, [...]

MySQL сказал: Документация

1070 - Указано слишком много ключевых деталей; разрешено до 32 деталей

1 Ответ

0 голосов
/ 28 февраля 2020

Предотвращение дубликатов путем создания уникального индекса:

create unique index unq_table1_all_columns on table1 ( . . . );  -- you gotta list the columns here.

Вам необходимо перечислить столбцы, но это необходимо, чтобы база данных знала ваше намерение. Список легко составить, например:

select group_concat(column_name, ', ')
from information_schema.columns
where table_name = 'table1';

Тогда ваша вставка выдаст ошибку, если найдутся дубликаты. Или, чтобы избежать их, используйте on duplicate key update:

insert into table1 
    select *
    from table2
    on duplicate key update name = values(name);  -- this does nothing but it avoids an error on a duplicated row
...