(一)单个字段
1、查找表中多余的重复记录,根据(question_title)字段来判断
select * from questions where question_title in (select question_title from people group by question_title having count(question_title) > 1)
2、删除表中多余的重复记录,根据(question_title)字段来判断,只留有一个记录
delete from questions
where peopleId in (select peopleId from people group by peopleId having count(question_title) > 1)
and min(id) not in (select question_id from questions group by question_title having count(question_title)>1)
(二)多个字段
删除表中多余的重复记录(多个字段),只留有rowid最小的记录
DELETE FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1)
用上述语句无法删除,创建了临时表才删的,求各位达人解释一下。
CREATE TABLE tmp AS SELECT question_id FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1);
DELETE FROM questions WHERE question_id IN (SELECT question_id FROM tmp);
DROP TABLE tmp;
(三) 存储过程
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
例,
数据库版本 Server version: 5.1.41-community-log MySQL Community Server (GPL)
例1,表中有主键(可唯一标识的字段),且该字段为数字类型
例1测试数据
/* 表结构 */
DROP TABLE IF EXISTS `t1`;
CREATE TABLE IF NOT EXISTS `t1`(
`id` INT(1) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`add` VARCHAR(20) NOT NULL,
PRIMARY KEY(`id`)
)Engine=InnoDB;
/* 插入测试数据 */
INSERT INTO `t1`(`name`,`add`) VALUES
('abc',"123"),
('abc',"123"),
('abc',"321"),
('abc',"123"),
('xzy',"123"),
('xzy',"456"),
('xzy',"456"),
('xzy',"456"),
('xzy',"789"),
('xzy',"987"),
('xzy',"789"),
('ijk',"147"),
('ijk',"147"),
('ijk',"852"),
('opq',"852"),
('opq',"963"),
('opq',"741"),
('tpk',"741"),
('tpk',"963"),
('tpk',"963"),
('wer',"546"),
('wer',"546"),
('once',"546");
SELECT * FROM `t1`;
+----+------+-----+
| id | name | add |
+----+------+-----+
| 1 | abc | 123 |
| 2 | abc | 123 |
| 3 | abc | 321 |
| 4 | abc | 123 |
| 5 | xzy | 123 |
| 6 | xzy | 456 |
| 7 | xzy | 456 |
| 8 | xzy | 456 |
| 9 | xzy | 789 |
| 10 | xzy | 987 |
| 11 | xzy | 789 |
| 12 | ijk | 147 |
| 13 | ijk | 147 |
| 14 | ijk | 852 |
| 15 | opq | 852 |
| 16 | opq | 963 |
| 17 | opq | 741 |
| 18 | tpk | 741 |
| 19 | tpk | 963 |
| 20 | tpk | 963 |
| 21 | wer | 546 |
| 22 | wer | 546 |
| 23 | once | 546 |
+----+------+-----+
rows in set (0.00 sec)
查找id最小的重复数据(只查找id字段)
/* 查找id最小的重复数据(只查找id字段) */
SELECT DISTINCT MIN(`id`) AS `id`
FROM `t1`
GROUP BY `name`,`add`
HAVING COUNT(1) > 1;
+------+
| id |
+------+
| 1 |
| 12 |
| 19 |
| 21 |
| 6 |
| 9 |
+------+
rows in set (0.00 sec)
查找所有重复数据
/* 查找所有重复数据 */
SELECT `t1`.*
FROM `t1`,(
SELECT `name`,`add`
FROM `t1`
GROUP BY `name`,`add`
HAVING COUNT(1) > 1
) AS `t2`
WHERE `t1`.`name` = `t2`.`name`
AND `t1`.`add` = `t2`.`add`;
+----+------+-----+
| id | name | add |
+----+------+-----+
| 1 | abc | 123 |
| 2 | abc | 123 |
| 4 | abc | 123
| 6 | xzy | 456 |
| 7 | xzy | 456 |
| 8 | xzy | 456 |
| 9 | xzy | 789 |
| 11 | xzy | 789 |
| 12 | ijk | 147 |
| 13 | ijk | 147 |
| 19 | tpk | 963 |
| 20 | tpk | 963 |
| 21 | wer | 546 |
| 22 | wer | 546 |
+----+------+-----+
rows in set (0.00 sec)
相关推荐
本文将详细介绍如何在MySQL中查找并删除重复数据。 首先,我们需要识别哪些数据是重复的。假设我们有一个名为`my_table`的表,其中包含`column1`和`column2`等字段,可能存在重复数据。使用`GROUP BY`和`HAVING`...
本文将详细介绍如何在MySQL中查找并删除重复数据,同时只保留其中一条,具体以实例进行解析。 首先,假设我们有一个名为`test`的表格,包含以下字段:`school_id`、`school_name`、`total_student`和`test_takers`...
本文主要探讨了在MySQL中如何查找并删除重复行,这对于维护数据库的整洁性和提高查询效率有着重要的作用。 首先,我们需要明确什么是重复行。在MySQL中,如果表中的某一行与其他行在特定列上的值完全相同,那么这些...
今天我们就来谈谈如何查找 MySQL 表中的重复数据以及如何删除这些重复的记录。 创建示例表 首先创建一个示例表 people 并生成一些数据: drop table if exists people; create table people ( id int auto_...
在MySQL数据库管理中,有时我们需要找出数据表中的重复记录,以确保数据的准确性和一致性。在给定的标题和描述中,我们关注的核心知识点是...以上提供的方法和技巧可以帮助你更有效地查找、分析和解决重复数据的问题。
4. **删除重复数据**:如果你希望彻底删除重复数据,只保留一条,可以使用`DISTINCT`关键字创建一个新的表,或者使用`DELETE`语句结合子查询。但请注意,删除操作应谨慎进行,以免丢失重要信息。例如: ```sql ...
处理MySQL中的重复数据涉及多个层面,包括在设计阶段通过设置主键和唯一索引来预防,使用`INSERT IGNORE`或`REPLACE INTO`来处理插入时的重复,以及利用`GROUP BY`, `HAVING`, `DISTINCT`等查询构造来查找和删除重复...
总结一下,本篇文章主要介绍了如何利用shell脚本与MySQL结合,有效地查找并删除数据库中的重复数据。这包括了连接MySQL服务器的参数设置,使用SQL查询来定位重复数据,以及在循环中执行删除操作。通过这种方式,我们...
在Delphi中查找重复数据,主要步骤如下: 1. **建立数据库连接**:使用TDBXConnection组件连接到数据库,配置合适的连接字符串以确保能够访问目标数据库。 2. **创建数据集对象**:根据需要,选择TClientDataSet或...
针对单个字段查找并删除重复记录的情况,例如根据`peopleId`字段,可以执行以下操作: 1. 查找重复记录: ```sql SELECT * FROM people WHERE peopleId IN ( SELECT peopleId FROM people GROUP BY peopleId ...
在SQL数据库管理中,...以上就是一些关于SQL数据库中查找和删除重复数据的方法,以及如何更改表所属用户的技巧。在实际操作中,应根据具体数据库类型(如MySQL、SQL Server、Oracle等)和数据量大小选择合适的方法。
在MySQL数据库管理中,有时我们需要查询并处理表中的重复数据。本文将详细介绍如何利用SQL语句来检测和处理这些重复信息。 首先,我们要理解“重复数据”是指在某个或某些字段上具有相同值的记录。以下是一些常用的...
8. **mysql查找删除重复数据并只保留一条实例详解**:可以先使用`GROUP BY`和`MIN/MAX`或`COUNT(*)`找出重复记录,然后根据业务需求决定保留哪一条,最后通过`DELETE`或`UPDATE`语句进行处理。 了解这些相关知识点...
删除重复数据通常需要创建临时表来存储唯一记录,然后清空原始表并重新插入唯一数据。例如: ```sql CREATE TABLE tmp SELECT last_name, first_name, MIN(id) as id FROM person_tbl GROUP BY last_name, first_...
这个存储过程首先将指定的父节点ID存入临时表`childQueue`,然后在循环中不断删除队列中的节点并查找其子节点,将子节点加入队列,直到队列为空。这样就确保了所有子节点都被删除,最后父节点也被安全移除。 当然,...
- 在 **C:\Program Files** 或 **C:\Program Files (x86)** 中,查找并删除名为MySQL的文件夹。 - 在 **C:\ProgramData** 中,同样查找并删除MySQL相关的文件夹。 - 在 **C:\Users\[用户名]\AppData\Roaming** 中,...
为了加快对第二列(Col2)的查找速度,可以在表外构建一个二叉查找树,树中的每个节点包含索引键值和一个指向对应数据记录物理地址的指针。通过这种方式,可以在O(log2n)的时间复杂度内获取到所需数据。尽管这种结构...