delete 符合条件的记录中的前几条或者重复记录

本文介绍了如何在SQL Server和MySQL中删除符合条件的特定记录,包括删除前几条记录、重复记录及通过ORDER BY和LIMIT子句指定删除的记录。

今天写代码,遇到了这个问题,只能删除符合条件的记录中的某几条.


在网上查了一下,结合自己的经验. 

做法如下:

  1. 取出符合条件的records;
  2. 排序;
  3. delete 前面n条 或者 指定的第n条.

sql server:

--删除前3行
select top(3) * from dbo.t1
delete top(3) from dbo.t1

--删除重复记录
declare @count int
select @count =count(*) from dbo.t1 where name = 'guoqiang'
delete top(@count-1) from  dbo.t1 where name = 'guoqiang'

 

MySQL:
DELETE语句包括一个ORDER BY子句,则各行按照子句中指定的顺序进行删除。此子句只在与LIMIT联用是才起作用。下面的子句用于查找与WHERE子句对应的行,使用timestamp_column进行分类,并删除第一(最旧的)行。

 

DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp_column
LIMIT 1;

 

新增 mysq删除某些重复值的记录。

delete b from mem_world_building as b, (select *,min(sbid) as tbid from mem_world_building group by wid,bid having count(sbid) >1) as t
where  b.wid = t.wid and b.sbid = t.tbid and b.bid = t.bid

 

其他:

Delete From Table Where ID in ( Select Top N ID From Table Order By ID)

 

 

在数据库中删除重复记录是常见的操作,通常需要根据特定字段(或字段组合)来识别重复项,并保留其中一条记录。以下是几种常见方法,适用于不同数据库系统(如 Oracle、MySQLSQL Server 等)。 ### 使用 `ROWID` 和 `GROUP BY` 删除重复记录 在 Oracle 数据库中,可以利用 `ROWID` 来标识每一行的唯一性。通过 `GROUP BY` 子句找出重复记录,并删除多余的行。 ```sql DELETE FROM student WHERE rowid IN ( SELECT min(rowid) FROM student GROUP BY id, name, age HAVING COUNT(*) > 1 ); ``` 该语句会保留每组重复记录中 `ROWID` 最小的那一行,其余重复记录将被删除 [^1]。 ### 使用子查询和 `DISTINCT` 删除重复记录 另一种方法是通过子查询找到每组重复数据中需要保留的记录(如最小的 `ROWID`),然后删除不在该列表中的记录。 ```sql DELETE FROM test t WHERE t.rowid NOT IN ( SELECT c.r FROM ( SELECT DISTINCT z.name, MIN(z.rowid) r FROM test z GROUP BY z.name ) c ); ``` 该方法首先根据 `name` 字段分组并找到每组中最小的 `ROWID`,然后删除不在这些 `ROWID` 列表中的记录 [^2]。 ### 使用 `CTE` 和 `ROW_NUMBER()` 删除重复记录(适用于支持窗口函数的数据库) 在支持窗口函数的数据库(如 SQL Server、PostgreSQL)中,可以使用 `ROW_NUMBER()` 函数为每组记录分配一个行号,然后删除行号大于1的记录。 ```sql WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id, name, age ORDER BY id) AS rn FROM student ) DELETE FROM cte WHERE rn > 1; ``` 该语句使用 `ROW_NUMBER()` 函数对 `id, name, age` 字段组合进行分组,并按 `id` 排序分配行号。重复记录的行号大于1,将被删除。 ### 注意事项 - **备份数据**:在执行删除操作之,建议先备份数据,以防止误删重要信息。 - **测试环境验证**:建议在测试环境中先运行查询语句,确认筛选出的记录符合预期,再执行删除操作。 - **索引优化**:如果表中数据量较大,删除操作可能会影响性能,建议在低峰期执行,并确保相关字段有适当的索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值