1、select distinct a,b into #t from tb 2、truncate table tb 3、insert into tb select * from #t
With dup as ( Select *,ROW_NUMBER() Over(Partition by a,b order by a,b)as rn From tb ) Delete From Dup Where rn = 1 如果删除的数据量比较少可以用这个。MsSql server2008
With dup as ( Select *,ROW_NUMBER() Over(Partition by a,b order by a,b)as rn From tb ) Delete From Dup Where rn > 1 是大于 1 修改一下。
-------------如果删除的数据量比较大时 With dup as ( Select *,ROW_NUMBER() Over(Partition by a,b order by a,b)as rn From dbo.tb ) Select a,b Into dbo.duptmp From dup Where rn = 1; --- drop table tb; exec sp_rename 'dbo.duptmp','dbo.tb' 当删除的数据比较少时。
能不能解说下原理? 新手不大懂 第一步先把非重复的插入一个临时表(这个临时表就是你希望保留的数据),然后第二步把原表清空了,第三步把数据插回去原表测试小数据没问题,千万级别的数据,表示半小时了还没有搞定,有没有更高效的方法啊? 我这个方法是当初处理银行数据时候用的,最少300万数据。我运行半小时后提示:SQL Server 数据库引擎的实例此时无法获得 LOCK 资源。请在活动用户较少时重新运行该语句。请询问数据库管理员,检查此实例的锁定和内存配置,或检查是否有长时间运行的事务。
能不能解说下原理? 新手不大懂 第一步先把非重复的插入一个临时表(这个临时表就是你希望保留的数据),然后第二步把原表清空了,第三步把数据插回去原表测试小数据没问题,千万级别的数据,表示半小时了还没有搞定,有没有更高效的方法啊? 我这个方法是当初处理银行数据时候用的,最少300万数据。我运行半小时后提示:SQL Server 数据库引擎的实例此时无法获得 LOCK 资源。请在活动用户较少时重新运行该语句。请询问数据库管理员,检查此实例的锁定和内存配置,或检查是否有长时间运行的事务。你还有人用这个表是吧?这样的话别的的程序会使得这个表上加锁,如果你这个操作是频繁执行,那么最好分成大概1000行一次地update,如果只需要执行一次,那么用我的方法是可以的,不过可以修改一下第一步:select distinct a,b into #t from tb with(nolock)
2、truncate table tb
3、insert into tb select * from #t
(
Select *,ROW_NUMBER() Over(Partition by a,b order by a,b)as rn
From tb
)
Delete From Dup
Where rn = 1
如果删除的数据量比较少可以用这个。MsSql server2008
(
Select *,ROW_NUMBER() Over(Partition by a,b order by a,b)as rn
From tb
)
Delete From Dup
Where rn > 1
是大于 1 修改一下。
With dup as
(
Select *,ROW_NUMBER() Over(Partition by a,b order by a,b)as rn
From dbo.tb
)
Select a,b
Into dbo.duptmp
From dup
Where rn = 1;
---
drop table tb;
exec sp_rename 'dbo.duptmp','dbo.tb'
当删除的数据比较少时。
能不能解说下原理? 新手不大懂
第一步先把非重复的插入一个临时表(这个临时表就是你希望保留的数据),然后第二步把原表清空了,第三步把数据插回去原表测试小数据没问题,千万级别的数据,表示半小时了还没有搞定,有没有更高效的方法啊?
我这个方法是当初处理银行数据时候用的,最少300万数据。我运行半小时后提示:SQL Server 数据库引擎的实例此时无法获得 LOCK 资源。请在活动用户较少时重新运行该语句。请询问数据库管理员,检查此实例的锁定和内存配置,或检查是否有长时间运行的事务。
能不能解说下原理? 新手不大懂
第一步先把非重复的插入一个临时表(这个临时表就是你希望保留的数据),然后第二步把原表清空了,第三步把数据插回去原表测试小数据没问题,千万级别的数据,表示半小时了还没有搞定,有没有更高效的方法啊?
我这个方法是当初处理银行数据时候用的,最少300万数据。我运行半小时后提示:SQL Server 数据库引擎的实例此时无法获得 LOCK 资源。请在活动用户较少时重新运行该语句。请询问数据库管理员,检查此实例的锁定和内存配置,或检查是否有长时间运行的事务。你还有人用这个表是吧?这样的话别的的程序会使得这个表上加锁,如果你这个操作是频繁执行,那么最好分成大概1000行一次地update,如果只需要执行一次,那么用我的方法是可以的,不过可以修改一下第一步:select distinct a,b into #t from tb with(nolock)