sql server 2008 R2 删除数据表中多列属性重复的的记录

时间:2021-08-20 01:29:52

比如 有表stab,
有属性cl1,cl2,c3,cl4
我要删除表中存在这样行,比如row1,row2,删除row1中的cl1,cl2和row2 中的cl1和cl2分别相等的数据,也就是数据表中,部分属性重复的数据,使表中不存在重复数据


我写了如下语句
delete from stab as A
from A.cl1,A.cl2
in (select cl1,cl2 from stb group by cl1,cl2 having count(*) > 1) 
and rowid not in (select min(rowid) from stab group by cl1,cl2 having count(*)>1)


这是从网上查的,但是提示where   A.ListingId A.adId 有语法错误,好像只能写一个属性,另外rowid不识别  
  
    
怎么回事呢,求高手帮忙
  
  
    

8 个解决方案

#1



delete from stab where rowid not in
(select min(rowid) from stab 
group by cl1,cl2
having count(*)>1)
这样直接写就可以了

#2


引用 1 楼 littlerebeka 的回复:
delete from stab where rowid not in
(select min(rowid) from stab 
group by cl1,cl2
having count(*)>1)
这样直接写就可以了

这里rowid可以改成别的只要是不重复的属性就可以

#3



delete stab 
from stab  t1 
inner join 
(
  select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
  from stab
) t2
on t1.cl1 = t2.cl1 
   and t1.cl2 = t2.cl2 

where t2.row >1

#4


引用 楼主 hapure 的回复:
比如 有表stab,
有属性cl1,cl2,c3,cl4
我要删除表中存在这样行,比如row1,row2,删除row1中的cl1,cl2和row2 中的cl1和cl2分别相等的数据,也就是数据表中,部分属性重复的数据,使表中不存在重复数据


我写了如下语句
delete from stab as A
from A.cl1,A.cl2
in (select cl1,cl2 from stb group by cl1,cl2 having count(*) > 1) 
and rowid not in (select min(rowid) from stab group by cl1,cl2 having count(*)>1)


这是从网上查的,但是提示where   A.ListingId A.adId 有语法错误,好像只能写一个属性,另外rowid不识别  
  
    
怎么回事呢,求高手帮忙
  
  
    
rowid不识别,我用的是sqlserver2008 R2,这个里面美誉哦row,rowid 之类的东西

引用 3 楼 yupeigu 的回复:

delete stab 
from stab  t1 
inner join 
(
  select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
  from stab
) t2
on t1.cl1 = t2.cl1 
   and t1.cl2 = t2.cl2 

where t2.row >1
row 也不识别呢

#5


引用 4 楼 hapure 的回复:
Quote: 引用 楼主 hapure 的回复:


比如 有表stab,
有属性cl1,cl2,c3,cl4
我要删除表中存在这样行,比如row1,row2,删除row1中的cl1,cl2和row2 中的cl1和cl2分别相等的数据,也就是数据表中,部分属性重复的数据,使表中不存在重复数据


我写了如下语句
delete from stab as A
from A.cl1,A.cl2
in (select cl1,cl2 from stb group by cl1,cl2 having count(*) > 1) 
and rowid not in (select min(rowid) from stab group by cl1,cl2 having count(*)>1)


这是从网上查的,但是提示where   A.ListingId A.adId 有语法错误,好像只能写一个属性,另外rowid不识别  
  
    
怎么回事呢,求高手帮忙
  
  
    
rowid不识别,我用的是sqlserver2008 R2,这个里面美誉哦row,rowid 之类的东西

引用 3 楼 yupeigu 的回复:

delete stab 
from stab  t1 
inner join 
(
  select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
  from stab
) t2
on t1.cl1 = t2.cl1 
   and t1.cl2 = t2.cl2 

where t2.row >1
row 也不识别呢


哦,由于上面的帖子里的rowid是oracle专用的,所以我的代码中通过row_number()函数来动态算出来,新增为row这一列,那么这样就可以了。

#6


我试了一下,上面的代码确实还有点问题,我改了一下:

create table stab(cl1 int,cl2 int,cl3 varchar(10),cl4 varchar(10))

--truncate table stab

insert stab (cl1,cl2,cl3,cl4)
values(1,1,'a','b'),
      (1,2,'e','f'),
      
      (2,1,'c','d'),
      
      (3,1,'e','f'),
      (3,2,'a','b'),
      
      (2,1,'重复数据','d'),   --与第2条数据重复重复数据
      
      (1,1,'重复数据','f')    --与第1条数据重复数据
      

select *
from stab




--会删除cl1和cl2这两列的数据相同的行,cl3和cl4列可以不同
--delete stab 

with t1
as
(
  select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
  from stab
)

delete t1
from t1 
inner join t1 as t2
on t1.cl1 = t2.cl1 
   and t1.cl2 = t2.cl2 
   and t1.row = t2.row

where t2.row >=2 

#7


row_number() 不是被怎么破

#8


sqlserver2008 row_number()不识别,怎么破

#1



delete from stab where rowid not in
(select min(rowid) from stab 
group by cl1,cl2
having count(*)>1)
这样直接写就可以了

#2


引用 1 楼 littlerebeka 的回复:
delete from stab where rowid not in
(select min(rowid) from stab 
group by cl1,cl2
having count(*)>1)
这样直接写就可以了

这里rowid可以改成别的只要是不重复的属性就可以

#3



delete stab 
from stab  t1 
inner join 
(
  select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
  from stab
) t2
on t1.cl1 = t2.cl1 
   and t1.cl2 = t2.cl2 

where t2.row >1

#4


引用 楼主 hapure 的回复:
比如 有表stab,
有属性cl1,cl2,c3,cl4
我要删除表中存在这样行,比如row1,row2,删除row1中的cl1,cl2和row2 中的cl1和cl2分别相等的数据,也就是数据表中,部分属性重复的数据,使表中不存在重复数据


我写了如下语句
delete from stab as A
from A.cl1,A.cl2
in (select cl1,cl2 from stb group by cl1,cl2 having count(*) > 1) 
and rowid not in (select min(rowid) from stab group by cl1,cl2 having count(*)>1)


这是从网上查的,但是提示where   A.ListingId A.adId 有语法错误,好像只能写一个属性,另外rowid不识别  
  
    
怎么回事呢,求高手帮忙
  
  
    
rowid不识别,我用的是sqlserver2008 R2,这个里面美誉哦row,rowid 之类的东西

引用 3 楼 yupeigu 的回复:

delete stab 
from stab  t1 
inner join 
(
  select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
  from stab
) t2
on t1.cl1 = t2.cl1 
   and t1.cl2 = t2.cl2 

where t2.row >1
row 也不识别呢

#5


引用 4 楼 hapure 的回复:
Quote: 引用 楼主 hapure 的回复:


比如 有表stab,
有属性cl1,cl2,c3,cl4
我要删除表中存在这样行,比如row1,row2,删除row1中的cl1,cl2和row2 中的cl1和cl2分别相等的数据,也就是数据表中,部分属性重复的数据,使表中不存在重复数据


我写了如下语句
delete from stab as A
from A.cl1,A.cl2
in (select cl1,cl2 from stb group by cl1,cl2 having count(*) > 1) 
and rowid not in (select min(rowid) from stab group by cl1,cl2 having count(*)>1)


这是从网上查的,但是提示where   A.ListingId A.adId 有语法错误,好像只能写一个属性,另外rowid不识别  
  
    
怎么回事呢,求高手帮忙
  
  
    
rowid不识别,我用的是sqlserver2008 R2,这个里面美誉哦row,rowid 之类的东西

引用 3 楼 yupeigu 的回复:

delete stab 
from stab  t1 
inner join 
(
  select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
  from stab
) t2
on t1.cl1 = t2.cl1 
   and t1.cl2 = t2.cl2 

where t2.row >1
row 也不识别呢


哦,由于上面的帖子里的rowid是oracle专用的,所以我的代码中通过row_number()函数来动态算出来,新增为row这一列,那么这样就可以了。

#6


我试了一下,上面的代码确实还有点问题,我改了一下:

create table stab(cl1 int,cl2 int,cl3 varchar(10),cl4 varchar(10))

--truncate table stab

insert stab (cl1,cl2,cl3,cl4)
values(1,1,'a','b'),
      (1,2,'e','f'),
      
      (2,1,'c','d'),
      
      (3,1,'e','f'),
      (3,2,'a','b'),
      
      (2,1,'重复数据','d'),   --与第2条数据重复重复数据
      
      (1,1,'重复数据','f')    --与第1条数据重复数据
      

select *
from stab




--会删除cl1和cl2这两列的数据相同的行,cl3和cl4列可以不同
--delete stab 

with t1
as
(
  select *,row_number() over(partition by cl1,cl2 order by cl1) as row 
  from stab
)

delete t1
from t1 
inner join t1 as t2
on t1.cl1 = t2.cl1 
   and t1.cl2 = t2.cl2 
   and t1.row = t2.row

where t2.row >=2 

#7


row_number() 不是被怎么破

#8


sqlserver2008 row_number()不识别,怎么破