(stu表中的名字(name)是重复的)
问题:
在Mysql下执行:
delete from stu where name in (select name from stu group
by name having count(name) > 1) and id not in (select id from stu group by
name having count(name) > 1);
MySql报错: You can't specify target table 'table name' for update in FROM
clause
在
Mysql下执行:
select id from stu where name in (select name from stu group
by name having count(name) > 1) and id not in (select id from stu group by
name having count(name) > 1);
是成功的。
注意:上面的两句话很矛盾啊。
就现在的mysql版本(我用5.1)来说,不能先select出同一表中的某些值,再update这
个表(在同一语句中)
解决:
create table tmp_table as select id
from stu where name in (select name from stu group
by name having count(name) > 1) and id not in (select id from stu
group by
name having count(name) > 1);
delete from stu where id in (select id from tmp_table);
drop table tmp_table;
分享到:
相关推荐
本文将详细介绍如何处理两种类型的重复记录:完全重复和部分关键字段重复的记录,并提供在MySQL、SQL Server和Oracle数据库环境下对应的解决方案。 **完全重复记录的处理** 完全重复记录指的是所有字段值都相同的...
然而,仅仅查询重复数据还不够,我们还需要删除多余的记录,仅保留每个重复组中ID最小的那一条。这里要注意的是,MySQL不允许在`DELETE`语句中直接引用被删除的表。因此,我们需要创建一个临时表来存储需要保留的...
进一步,如果想要找到可以安全删除的重复记录,即保留每个分组中的一条记录,我们可以使用子查询来确定哪些记录是多余的。以下是一个示例: ```sql SELECT t1.* FROM employee t1 WHERE (t1.emp_name) IN ( ...
对于多个字段(如`username`和`passwd`)的重复记录,可以使用类似方法: ```sql SELECT username, passwd, COUNT(*) FROM hk_test GROUP BY username, passwd HAVING COUNT(*) > 1; ``` ### 删除重复记录: #...
而在Oracle 10g中,每个记录都有一个唯一的`rowid`,可以通过`rowid`来定位并删除重复记录中的多余项: ```sql -- Oracle 10g SELECT * FROM test; SELECT * FROM test GROUP BY id HAVING COUNT(*) > 1; SELECT ...
2. 删除多余重复记录,保留每个`(peopleId, seq)`最小`rowid`的记录: ```sql DELETE FROM vitae a WHERE (a.peopleId, a.seq) IN ( SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING COUNT(*) > ...
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 例二: ...
例如,假设我们要删除所有first_name和last_name相同的多余记录,可以分两步操作: 1. 创建临时表存储不重复数据: ```sql CREATE TEMPORARY TABLE temp_person AS SELECT first_name, last_name FROM person_tbl ...
* 对 MySQL 数据库去重的关键字是 `SELECT DISTINCT`,可以过滤掉多余的重复记录,仅保留一条记录。 * MySQL 多表连接有左连接、右连接、内连接三种方式,每种连接方式都有其特点和应用场景。 二、索引知识点 * ...
- **减少多余的行访问**: 在应用程序端进行联接减少了对同一行数据的重复访问。 - **减少网络流量和内存消耗**: 分解联接减少了数据传输量和内存使用。 #### 三、MySQL查询优化器工作原理 MySQL使用基于开销的...
本文将探讨两种高效的方法来去除具有相同字段值的重复记录,主要针对MySQL环境。 首先,我们来看传统的方法,即使用`DELETE`语句配合`NOT IN`子查询。这种方法的基本思路是保留每个唯一组合的最大或最小`ID`,然后...
- **主键**:是表中的一个或一组字段,其值能够唯一标识表中的一条记录,不允许有重复且不能为空。 - **超键**:如果一个字段或一组字段的值可以唯一标识表中的一行,那么它就是一个超键,它可以包含多余的列。 -...
如果需要删除多余的重复记录,仅保留`id`最小的记录,可以使用以下语句: ```sql DELETE FROM user WHERE nick_name IN ( SELECT nick_name FROM (SELECT nick_name FROM user GROUP BY nick_name HAVING COUNT...
- 主键:唯一标识表中每条记录的字段集合,不可重复,也不能为空。 - 外键:用来与其他表的主键建立联系的字段,表示本表记录和另一张表记录的关联关系。 - 超键:在关系数据库中能够唯一标识元组的属性集,超键...
- 主键(Primary Key)是表中唯一标识记录的字段或字段组合,不可重复且不允许为空。 - 超键(Super Key)是一个或一组属性,可以唯一标识一个记录,可能包含多余属性。 - 候选键(Candidate Key)是可能的主键,...
超键可能包含多余的属性。 - **候选键**:候选键是最小的超键,它不包含任何冗余属性,也就是说,候选键是能够唯一标识一条记录的最小属性集合。 - **外键**:外键是一个表中引用另一个表主键的字段,用于建立和...
可以通过子查询结合`DELETE`语句删除多余的重复记录,例如删除people表中peopleId重复且rowid不是最小的记录。 以上是SQL操作语句的基础介绍,它们构成了SQL的核心功能,用于高效地管理和查询数据库。在实际应用中...
删除表中的重复记录通常需要结合GROUP BY和HAVING子句以及ROWID(Oracle中的行标识符)来确定并删除多余的记录。 【存储过程和存储函数】 存储过程是预编译的SQL语句集合,存储在数据库中,可以在需要时调用,以...
LIMIT 和 OFFSET 关键字(在某些数据库系统中,如 MySQL)用于实现分页功能,限制返回的记录数。 I: 触发器 触发器是预定义的 SQL 代码,当特定的数据库操作(如 INSERT、UPDATE 或 DELETE)发生时自动执行。 J: ...