MySQL:如何从含重复值的表中获取单一值并插入目标表
解决重复插入的问题
我明白你的需求了——现在你的SQL会把SourceTable里所有符合ColumnB = 'a'的重复记录都插到TargetTable里,但你只需要保留一条对应ColumnB和ColumnC组合的记录对吧?
下面给你几个实用的解决方案,根据你的场景选就行:
方法1:用DISTINCT直接去重
这是最简单的方式,在SELECT语句前加上DISTINCT,它会自动帮你过滤掉所有列完全重复的记录(因为'Bob'是固定值,now()是当前时间,所以只要ColumnB和ColumnC重复,整行就会被视为重复):
INSERT INTO TargetTable SELECT DISTINCT 'Bob', ColumnB, ColumnC, now(), ... FROM SourceTable WHERE ColumnB = 'a';
方法2:用GROUP BY分组取唯一值
通过按ColumnB和ColumnC分组,确保每组只返回一条记录,效果和DISTINCT类似,适合需要同时做聚合计算的场景(比如统计重复次数):
INSERT INTO TargetTable SELECT 'Bob', ColumnB, ColumnC, now(), ... FROM SourceTable WHERE ColumnB = 'a' GROUP BY ColumnB, ColumnC;
注意:部分数据库(比如MySQL开启
ONLY_FULL_GROUP_BY模式时)要求SELECT里的非聚合列必须出现在GROUP BY中,这里'Bob'是常量、now()是系统函数,所以完全没问题。
方法3:用窗口函数精准控制取哪一条记录
如果需要指定取重复记录中的某一条(比如按ColumnA最大/最小的那条),用ROW_NUMBER()窗口函数会更灵活:
INSERT INTO TargetTable SELECT 'Bob', ColumnB, ColumnC, now(), ... FROM ( SELECT ColumnB, ColumnC, ..., -- 按ColumnB和ColumnC分组,每组内按ColumnA降序排序,取第一条 ROW_NUMBER() OVER (PARTITION BY ColumnB, ColumnC ORDER BY ColumnA DESC) AS rn FROM SourceTable WHERE ColumnB = 'a' ) t WHERE rn = 1;
把ORDER BY ColumnA DESC改成ASC就能取ColumnA最小的那条,完全按需调整。
这些方法都支持动态的ColumnB值,你只需要在应用代码里把'a'换成对应的用户输入参数就行(记得用占位符?或者:param,避免SQL注入哦)。
内容的提问来源于stack exchange,提问作者Carlo Santana
相关产品推荐
相关产品推荐

