SQL去除重复数据,无主键

一个没留神,数据库表table1被同事改的代码插入了重复数据,是很规律的每一条数据重复出现两次,查重SQL如下:

SELECT column1, count(*) num FROM table1 GROUP BY column1 HAVING num > 1

本来打算参照其他去重的办法直接套用SQL语句:

DELETE FROM table1
    WHERE id NOT IN 
    ( 
    SELECT 
        a.id 
    FROM ( 
        SELECT MAX( id ) AS id FROM table1 GROUP BY column1 
        )a 
    )

奈何写了两句才发现,这个表,它没主键!!想了一下,没有主键且所有字段都没有要求唯一的情况下,没有任何办法可以区分两条重复数据,老老实实用中间表吧,复制当前表结构,建立table1_copy,然后把所有非重复数据拷过去:

INSERT INTO table1_copy (
	SELECT DISTINCT
		column1,
		column2,
		...,
		columnX 
	FROM
	    table1
	)

鉴于我遇到的数据情况很简单,DISTINCT column1就可以完美匹配当前需求,数据拷过去之后给当前table1重命名改为备份表,table1_copy重命名为table1即可。

### 如何使用SQL删除重复记录或选择唯一数据 #### 删除重复记录 在关系型数据库中,可以通过多种方式删除表中的重复记录。以下是几种常见的方式: 1. **MySQL删除重复记录并保留一条** 使用自连接的方法可以有效地删除重复记录,并仅保留每组重复记录中 `id` 最小的一条记录[^1]。 ```sql DELETE t1 FROM your_table t1 INNER JOIN your_table t2 ON t1.name = t2.name AND t1.id > t2.id; ``` 2. **Oracle 数据库删除重复记录** Oracle 提供了 `ROWID` 属性作为每一行的唯一标识符。利用此属性,可以选择性地删除重复记录,同时保留一组重复记录中某一行的数据[^2]。 ```sql DELETE FROM your_table WHERE ROWID NOT IN ( SELECT MIN(ROWID) FROM your_table GROUP BY column1, column2, ..., columnN ); ``` 3. **SQL Server 中删除重复记录** 对于 SQL Server,可以通过创建临时表的方式来实现去重操作。具体做法是先将无重复记录的结果存入临时表,随后替换原表的内容[^3]。 ```sql -- 创建临时表存储无重复记录 SELECT DISTINCT * INTO #TempTable FROM your_table; -- 清空原表 TRUNCATE TABLE your_table; -- 将临时表内容重新导入到原表 INSERT INTO your_table SELECT * FROM #TempTable; -- 删除临时表 DROP TABLE #TempTable; ``` 4. **通用方法:基于主键删除重复记录** 借助分组查询和子查询技术,可以从任意支持标准 SQL数据库删除重复记录。以下是一个适用于大多数数据库系统的解决方案[^4]。 ```sql DELETE FROM your_table WHERE id NOT IN ( SELECT MIN(id) FROM your_table GROUP BY name, login_date ); ``` 5. **复杂条件下的重复记录删除** 当需要根据多个字段组合判断重复时,可以扩展上述逻辑以适应更复杂的场景[^5]。 ```sql DELETE FROM lib WHERE (`name`, version) IN ( SELECT t.`name`, t.version FROM ( SELECT `name`, version FROM lib GROUP BY `name`, version HAVING COUNT(*) > 1 ) t ) AND id NOT IN ( SELECT dt.minid FROM ( SELECT MIN(id) AS minid FROM lib GROUP BY `name`, version HAVING COUNT(*) > 1 ) dt ); ``` #### 查询唯一数据 如果只需查询不带重复项的数据而不修改实际表格,则可采用如下方法: - 利用 `DISTINCT` 关键字返回指定列的不同值集合[^3]。 ```sql SELECT DISTINCT column_name(s) FROM table_name; ``` - 或者通过聚合函数配合 `GROUP BY` 子句完成相同目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值