首页 > 解决方案 > SQL 连接表,但排除除 1 之外的所有列匹配的重复项

问题描述

我对 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)

我唯一的问题是我有几十个专栏,不想把它们都写出来。基本上,我需要删除所有列都相同的重复项,除了 datetime 列。

(在不同时间输入的重复项,因此即使 datetime 列中的值不同,对我来说这仍然是重复项。)

有没有办法加入表格但删除除 1 列之外的所有匹配项的重复项?

更新:

非常感谢您的回答!我可能做错了,但现在我收到 SQL 错误,因为列太多:

在audi_all上创建唯一索引unq_audi_all_columns ( 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 ParticulasTecto de AbrirMedida Jantes de Liga LeveVINIVA dedutívelEmissões CO2IUCou atéMatrículaConsumo CombinadoAutonomia MáximaConsumo UrbanoConsumo Extra UrbanoCapotaCapota Eléctrica, Clássico, Salvado, Valor sem IUC, Valor sem ISV, [...]

MySQL 说:文档

1070 - 指定的关键部分太多;最多允许 32 个零件

标签: mysqlsqljoinduplicatesunion

解决方案


通过创建唯一索引来防止重复:

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

推荐阅读