比如说我有个表table1,里面有id,name,sex ....
id唯一,现在数据里有重复的,就是id不一样,但name,sex什么的都一样,现在我要把那些多余的记录删除掉,请问sql语句怎么写啊?
删除重复数据
一、具有主键的情况
a.具有唯一性的字段id(为唯一主键)
delect table
where id not in
(
select max(id) from table group by col1,col2,col3...
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,
那么只要col1字段内容相同即表示记录相同。
b.具有联合主键
假设col1+,+col2+,...col5 为联合主键
select * from table where col1+,+col2+,...col5 in (
select max(col1+,+col2+,...col5) from table
where having count(*)>1
group by col1,col2,col3,col4
)
group by 子句后跟的字段就是你用来判断重复的条件,
如只有col1,那么只要col1字段内容相同即表示记录相同。
c:判断所有的字段
select * into #aa from table group by id1,id2,....
delete table
insert into table
select * from #aa
二、没有主键的情况
a:用临时表实现
select identity(int,1,1) as id,* into #temp from ta
delect #temp
where id not in
(
select max(id) from # group by col1,col2,col3...
)
delete table ta
inset into ta(...)
select ..... from #temp
b:用改变表结构来实现
alter table 表 add newfield int identity(1,1)
delete 表
where newfield not in
(
select min(newfield) from 表 group by 除newfield外的所有字段
)
alter table 表 drop column newfield
如果有ID字段,就是具有唯一性的字段
delect table where id not in (
select max(id) from table group by col1,col2,col3...
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。
2,如果是判断所有字段也可以这样
select * into #aa from table group by id1,id2,....
delete table
insert into table
select * from #aa
3,没有ID的情况
select identity(int,1,1) as id,* into #temp from tabel
delect # where id not in (
select max(id) from # group by col1,col2,col3...)
delect table
inset into table(...)
select ..... from #temp
col1+,+col2+,...col5 联合主键
select * from table where col1+,+col2+,...col5 in (
select max(col1+,+col2+,...col5) from table
where having count(*)>1
group by col1,col2,col3,col4
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。
2,
select identity(int,1,1) as id,* into #temp from tabel
select * from #temp where id in (
select max(id) from #emp where having count(*)>1 group by col1,col2,col3...)
创建一个临时表,把不同的记录放进去,删除原来的表的内容,再把临时表内容放回去就可以了
--这里只列出两个字段,还有其它的字段可以再添
select distinct name, sex into #temptable from table1
truncate table table1
select * from #temptable
insert into table1 select * from #temptable
drop table #temptable
联合主键
or
select * from table where exists (select 1 from table x where table.col1 = x.col1 and table.col2= x.col2 group by x.col1,x.col2 having count(*) >1)