sql删除id相同数据只保留一条
时间: 2025-01-05 16:48:08 浏览: 6
在SQL中,如果你想删除具有相同ID的多条记录,只保留一条记录,可以使用多种方法来实现。以下是几种常见的方法:
### 方法一:使用子查询和临时表
1. 创建一个临时表,存储需要保留的记录。
2. 将去重后的数据插入临时表。
3. 删除原表中的所有数据。
4. 将临时表中的数据重新插入原表。
5. 删除临时表。
```sql
-- 创建临时表
CREATE TABLE temp_table AS
SELECT * FROM original_table WHERE id IN (
SELECT MIN(id) FROM original_table GROUP BY column1, column2, ...
);
-- 清空原表
DELETE FROM original_table;
-- 将去重后的数据插入原表
INSERT INTO original_table SELECT * FROM temp_table;
-- 删除临时表
DROP TABLE temp_table;
```
### 方法二:使用窗口函数(适用于支持窗口函数的数据库,如SQL Server, PostgreSQL, Oracle等)
1. 使用窗口函数为每组相同ID的记录编号。
2. 删除编号大于1的记录。
```sql
DELETE FROM original_table
WHERE id IN (
SELECT id FROM (
SELECT id, ROW_NUMBER() OVER (PARTITION BY column1, column2, ... ORDER BY id) AS rn
FROM original_table
) t
WHERE rn > 1
);
```
### 方法三:使用自连接
1. 自连接原表,找到重复的记录。
2. 删除重复的记录,只保留一条。
```sql
DELETE t1
FROM original_table t1
INNER JOIN original_table t2
ON t1.column1 = t2.column1
AND t1.column2 = t2.column2
AND t1.id > t2.id;
```
### 方法四:使用CTE(公共表表达式)
1. 使用CTE为每组相同ID的记录编号。
2. 删除编号大于1的记录。
```sql
WITH CTE AS (
SELECT id, ROW_NUMBER() OVER (PARTITION BY column1, column2, ... ORDER BY id) AS rn
FROM original_table
)
DELETE FROM original_table
WHERE id IN (
SELECT id FROM CTE WHERE rn > 1
);
```
阅读全文