oracle查询重复数据方法

在处理数据库中的重复记录时,我们通常需要确定哪些记录是重复的,并且决定如何处理这些重复记录。以下是一些常见的SQL查询和删除重复记录的方法,以及如何优化这些操作。

### 一、查询和删除基于单个字段的重复记录

#### 1. 查询重复记录
```sql

select * from people
where peopleId in (select   peopleId from   people group by   peopleId having count
(peopleId) > 1)


```

#### 2. 删除多余的重复记录
```sql

DELETE FROM people
WHERE peopleId IN (
    SELECT peopleId FROM people
    GROUP BY peopleId
    HAVING COUNT(peopleId) > 1
)
AND rowid NOT IN (
    SELECT MIN(rowid) FROM people
    GROUP BY peopleId
    HAVING COUNT(peopleId) > 1
);


```

### 二、查询和删除基于多个字段的重复记录

#### 3. 查询重复记录
```sql

SELECT * FROM vitae a
WHERE (a.peopleId, a.seq) IN (
    SELECT peopleId, seq FROM vitae
    GROUP BY peopleId, seq
    HAVING COUNT(*) > 1
);


```

#### 4. 删除多余的重复记录
```sql

DELETE FROM vitae a
WHERE (a.peopleId, a.seq) IN (
    SELECT peopleId, seq FROM vitae
    GROUP BY peopleId, seq
    HAVING COUNT(*) > 1
)
AND rowid NOT IN (
    SELECT MIN(rowid) FROM vitae
    GROUP BY peopleId, seq
    HAVING COUNT(*) > 1
);


```

#### 5. 查询不包含最小rowid的重复记录
这个方法与第3点相同,因为它已经排除了具有最小rowid的记录。

### 三、使用游标删除重复记录#### 方法一
使用游标逐条删除重复记录,保留每组重复记录中的第一条。
```sql

DECLARE @max INT, @id INT;
DECLARE cur_rows CURSOR FOR
SELECT peopleId, COUNT(*) FROM people
GROUP BY peopleId
HAVING COUNT(*) > 1;

OPEN cur_rows;
FETCH NEXT FROM cur_rows INTO @id, @max;

WHILE @@FETCH_STATUS = 0
BEGIN
    DELETE FROM people WHERE peopleId = @id ORDER BY rowid DESC LIMIT @max - 1;
    FETCH NEXT FROM cur_rows INTO @id, @max;
END

CLOSE cur_rows;
DEALLOCATE cur_rows;


```

### 四、查询重复记录的简化方法

#### 简化查询
```sql

SELECT * FROM tablename
WHERE id IN (
    SELECT id FROM tablename
    GROUP BY id
    HAVING COUNT(id) > 1
);


```

### 优化建议

1. **索引**:在执行删除操作前,确保对`peopleId`或组合字段(如`peopleId, seq`)有适当的索引,这可以加快查询和删除的速度。
2. **批量操作**:如果可能,尽量避免逐条删除记录,这会降低性能。尝试使用批量删除操作。
3. **事务**:在执行删除操作时,使用事务来确保数据的一致性,如果操作过程中出现问题,可以回滚到操作前的状态。
4. **测试**:在生产环境执行删除操作之前,在测试环境中测试SQL语句,确保它们按预期工作。

请注意,上述SQL语句可能需要根据你使用的数据库系统(如MySQL、PostgreSQL、SQL Server等)进行调整,因为不同的数据库系统在语法和功能上可能有所不同。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值