利用 CTE 和 ROW_NUMBER() 在原表删除重复数据
不用临时表的做法:
1、建测试数据
create table TableA(f1 int,f2 varchar(10))
goinsert TableA values(1,'abc')
insert TableA values(1,'abc')
insert TableA values(1,'abc')
insert TableA values(2,'abcd')
insert TableA values(2,'abcd')
insert TableA values(3,'xxxx')
go2、以下代码完成删除,并显示结果
declare @p1 int,@p2 varchar(10)declare c1 cursor for
select f1,f2 from TableA
open c1
fetch next from c1 into @p1,@p2
while @@fetch_status = 0
begin
WITH [CTE_ROWID] AS
(select row_number() over(order by f1) as ROWID,* from TableA where f1 = @p1 and f2 = @p2)
delete [CTE_ROWID]
where ROWID > 1
fetch next from c1 into @p1,@p2
end
close c1
deallocate c1select * from TableA3、结果如下:
f1 f2
----------- ----------
1 abc
2 abcd
3 xxxx 4、删除测试表
drop TableA 注:之所以使用游标,是因为语句
WITH [CTE_ROWID] AS
(select row_number() over(order by f1) as ROWID,* from TableA)
DELETE [CTE_ROWID]
FROM [CTE_ROWID] a WHERE
exists (select * from [CTE_ROWID] where f1 = a.f1 and f2 = a.f2 and ROWID < a.ROWID)执行结果错误,将删去全部数据。在2005的SP3(Build 4035)和SP4(Build5000)测试结果一致。
在2008(Build1600)测试结果也是如此。
这可以算一个BUG?
不用临时表的做法:
1、建测试数据
create table TableA(f1 int,f2 varchar(10))
goinsert TableA values(1,'abc')
insert TableA values(1,'abc')
insert TableA values(1,'abc')
insert TableA values(2,'abcd')
insert TableA values(2,'abcd')
insert TableA values(3,'xxxx')
go2、以下代码完成删除,并显示结果
declare @p1 int,@p2 varchar(10)declare c1 cursor for
select f1,f2 from TableA
open c1
fetch next from c1 into @p1,@p2
while @@fetch_status = 0
begin
WITH [CTE_ROWID] AS
(select row_number() over(order by f1) as ROWID,* from TableA where f1 = @p1 and f2 = @p2)
delete [CTE_ROWID]
where ROWID > 1
fetch next from c1 into @p1,@p2
end
close c1
deallocate c1select * from TableA3、结果如下:
f1 f2
----------- ----------
1 abc
2 abcd
3 xxxx 4、删除测试表
drop TableA 注:之所以使用游标,是因为语句
WITH [CTE_ROWID] AS
(select row_number() over(order by f1) as ROWID,* from TableA)
DELETE [CTE_ROWID]
FROM [CTE_ROWID] a WHERE
exists (select * from [CTE_ROWID] where f1 = a.f1 and f2 = a.f2 and ROWID < a.ROWID)执行结果错误,将删去全部数据。在2005的SP3(Build 4035)和SP4(Build5000)测试结果一致。
在2008(Build1600)测试结果也是如此。
这可以算一个BUG?
解决方案 »
- 问个简单的问题,我想用a表的url字段的值,更新b表中对应a表id与b表相同的,b表url字段的值
- 求一个sql语句
- sql2005和sql2000能同时装上吗?
- ■■■常用的数据汇总统计的过程,如何现优化?■■■
- 如何在程序中执行SQL脚本
- 100分,大侠们,求一复杂sql!
- 哪位高手做过用友财务软件接口的
- 高分送出!!! Sql server 分布式协调处理与 Win2000 中的冲突问题.
- 如何通过SQL语句从数据字典中获取oracle的表空间分配情况
- 求助SQL语句,将一个字段的值分开分别送到该字段,并且另外一个字段的值后面加特殊符号来区分上个字段的内容
- SQL SERVER2000和SQL SERVER2005问题。
- 一个关于建立作业的BUG, 查了半天了不知道什么原因, 求助.
goinsert TableA values(1,'abc')
insert TableA values(1,'abc')
insert TableA values(1,'abc')
insert TableA values(2,'abcd')
insert TableA values(2,'abcd')
insert TableA values(3,'xxxx')
go;with t as
(
select row_number() over(partition by f1 order by f2) as id, * from TableA
)
delete from t where id>1select* from TableA
/*
f1 f2
----------- ----------
1 abc
2 abcd
3 xxxx(3 行受影响)*/
drop table TableA
create table TableA(f1 int,f2 varchar(10))
goinsert TableA values(1,'abc')
insert TableA values(1,'abc')
insert TableA values(1,'abc')
insert TableA values(2,'abcd')
insert TableA values(2,'abcd')
insert TableA values(3,'xxxx')
gowith cte as
(
select *,row=row_number() over(partition by f1 order by getdate()) from TableA
)
delete cte where row>1select * from TableA
/*
f1 f2
----------- ----------
1 abc
2 abcd
3 xxxx(3 行受影响)*/