首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

跪求 sqlserver中剔除根据多个字段查询出来的重复记录保留一条就可以了

2013-10-11 
跪求sqlserver中删除根据多个字段查询出来的重复记录保留一条就可以了。本人用的sql2000;比如 表明是 Peopl

跪求 sqlserver中删除根据多个字段查询出来的重复记录保留一条就可以了。
本人用的sql2000;

比如 表明是 People,它有name,sex,age,love,marry 这5个字段。例:数据如下 
   name    sex     age      love         marry   
   
   张三      N      22      足球              否              
   张三      F      50   篮球              否              
   张三      N      50   篮球         否              
   赵六      F      30   上网         是              
   赵六      N      30   上网         是              
   赵六      N      30  听音乐       是        

现在根据name 和sex 两个字段查询数据,可以看到name和sex同时相同的只有 (张三 N) 和(赵六 N)。两个字段同时相同的数据只保留一条就可以了。比如(张三  N 。。。 )和(赵六 N。。。)分别保留一条数据就可以了。结果只有 张三 N  、张三 F、赵六 N、赵六 F 这四条数据了。

求sql语句。

在线等。。。

          sqlserver 删除重复记录?保留一条
[解决办法]

SELECT [name],[sex],[age],[love],[marry]
FROM
(
SELECT *,rn=ROW_NUMBER() OVER(PARTITION BY [name],[sex] ORDER BY GETDATE()) 
FROM [People] 
) T
WHERE rn=1

[解决办法]

create table People
(name varchar(10), sex varchar(10), age int, love varchar(10), marry varchar(10))

insert into People 
 select '张三', 'N', 22, '足球', '否' union all         
 select '张三', 'F', 50, '篮球', '否' union all
 select '张三', 'N', 50, '篮球', '否' union all
 select '赵六', 'F', 30, '上网', '是' union all
 select '赵六', 'N', 30, '上网', '是' union all
 select '赵六', 'N', 30, '听音乐', '是'


select distinct name,sex from People

/*
name       sex
---------- ----------
张三         F
张三         N
赵六         F
赵六         N

(4 row(s) affected)
*/


select identity(int,1,1) 'rn',* 
 into #t
 from People

select a.name,a.sex,a.age,a.love,a.marry 
 from #t a
 where not exists(select 1 from #t b
                  where b.rn<a.rn and b.name=a.name and b.sex=a.sex)

/*
name       sex        age         love       marry
---------- ---------- ----------- ---------- ----------
张三         N          22          足球         否
张三         F          50          篮球         否
赵六         F          30          上网         是


赵六         N          30          上网         是

(4 row(s) affected)
*/


[解决办法]

[解决办法]
本来我想用age的但是发现有重复数据所以不用,你还是给实际数据吧
[解决办法]
应该用联合主键防止这类数据的产生,下面的 SQL 通过循环删除复制数据:
while 1=1 
begin
delete top (1) from People
from People a join ( select name,sex from People group by name,sex having COUNT(*)>1 ) b
on a.name=b.name and a.sex=b.sex
if @@ROWCOUNT=0 break;
end;

[解决办法]

create table People
(name varchar(10), sex varchar(10), age int, love varchar(10), marry varchar(10))
 
insert into People 
 select '张三', 'N', 22, '足球', '否' union all             
 select '张三', 'F', 50, '篮球', '否' union all
 select '张三', 'N', 50, '篮球', '否' union all
 select '赵六', 'F', 30, '上网', '是' union all
 select '赵六', 'N', 30, '上网', '是' union all
 select '赵六', 'N', 30, '听音乐', '是'
 
 

select identity(int,1,1) 'rn',* 
 into #t
 from People

truncate table People

insert into People
select a.name,a.sex,a.age,a.love,a.marry 
 from #t a where not exists(select 1 from #t b
                            where b.rn<a.rn and b.name=a.name and b.sex=a.sex)

select * from People



/*
name       sex        age         love       marry
---------- ---------- ----------- ---------- ----------
张三         N          22          足球         否
张三         F          50          篮球         否
赵六         F          30          上网         是
赵六         N          30          上网         是

(4 row(s) affected)
*/

热点排行