如何处理两表重复行:保留首表指定列的唯一记录
保留主表重复记录,移除副表重复行
需求:存在两张表table a和table b,当指定列value的值重复时,保留table a的记录,移除table b中对应的重复行。
原表数据
table a
| id | value | name | pid |
|---|---|---|---|
| 1 | 55 | a | 27 |
| 2 | 56 | b | 23 |
| 3 | 57 | c | 22 |
table b
| id | value | name | pid |
|---|---|---|---|
| 1 | 55 | a | 29 |
| 5 | 58 | d | 23 |
| 6 | 59 | e | 22 |
预期结果
| id | value | name | pid |
|---|---|---|---|
| 1 | 55 | a | 27 |
| 2 | 56 | b | 23 |
| 3 | 57 | c | 22 |
| 5 | 58 | d | 23 |
| 6 | 59 | e | 22 |
需要移除的table b中的行:
| id | value | name | pid |
|---|---|---|---|
| 1 | 55 | a | 29 |
实现方案
方案1:查询合并后的结果(不修改原表)
如果仅需获取合并后的数据集,无需改动原表,可通过UNION ALL结合子查询过滤:
SELECT * FROM `table a` UNION ALL SELECT * FROM `table b` WHERE `value` NOT IN (SELECT `value` FROM `table a`);
也可用左连接方式过滤:
SELECT b.* FROM `table b` b LEFT JOIN `table a` a ON b.`value` = a.`value` WHERE a.`value` IS NULL UNION ALL SELECT * FROM `table a`;
方案2:删除table b中的重复行(修改原表)
若需直接删除table b中与table a的value重复的行,执行以下删除语句:
DELETE FROM `table b` WHERE `value` IN (SELECT `value` FROM `table a`);
部分数据库(如MySQL)更推荐关联删除,避免子查询性能问题:
DELETE b FROM `table b` b JOIN `table a` a ON b.`value` = a.`value`;
注意:执行删除操作前建议先备份数据,或用SELECT验证待删除行是否正确:
SELECT * FROM `table b` b JOIN `table a` a ON b.`value` = a.`value`;
内容的提问来源于stack exchange,提问作者Zakir Hossain
相关产品推荐
相关产品推荐

