您的位置:首页 > 职场人生

公司面试题目之取出数据库中重复的记录

2011-03-26 18:45 344 查看
公司最近招人,一道笔试题,就是查询出数据表中重复的记录,应该来说用过分组查寻的,这道题并不在话下,我们先来看看这张表
--使用distinct关键字查出去重后的记录,并将结果存储在临时表中
select distinct * into #temp from repeat
--删除 repeat 表
delete repeat
--再从临时表中取出所有结果放回repeat表中
insert repeat select * from #temp
--删除临时表
drop table #temp

select * from repeat a
where
(a.userName ) in (select userName from repeat group by userName,userPassword having count(*) > 1)
and
(a.userPassword ) in (select userPassword from repeat group by userName,userPassword having count(*) > 1)



这样取出的是用户名与密码相同的记录!将select改为delete即可删除,当然,这样删除就全部删除了,如果想要留一条,还可在后面加限定条件,来决定留下哪一条!

更正:经gatusso52#163.com网友指出。上面这条SQL语句存在逻辑性错误,即当表中存在userName=a,userPassword=fengyan时,按上述语句查寻重复会将这条记录查出。where userName in ……and userPassword in ……刚好也适用于 用户名为A密码为fengyan的记录!查询重复可以使用如下语句:

create table #user
(
UserName varchar(50),
UserPassword varchar(50)
)

insert into #user values('fengyan','fengyan')

insert into #user values('fengyan','fengyan')

insert into #user values('fengyan','fengyan')

insert into #user values('a','a')

insert into #user values('a','a')

insert into #user values('a','fengyan')

--存在逻辑性错误的SQL语句
select * from #user a
where
(a.userName ) in (select userName from #user group by userName,userPassword having count(*) > 1)
and
(a.userPassword ) in (select userPassword from #user group by userName,userPassword having count(*) > 1)

--更正为
create table #tempuser
(
UserName varchar(50),
UserPassword varchar(50)
)

DECLARE MyCURSOR CURSOR
FOR
select * from #user a group by userName,userPassword
having count(*)>1

DECLARE @userName varchar(50),@userPassword varchar(50)
OPEN MyCURSOR
FETCH MyCURSOR INTO @userName,@userPassword
WHILE @@FETCH_STATUS=0
begin
insert into #tempuser select * from #user where userName=@userName and userPassword=@userPassword

FETCH MyCURSOR INTO @userName,@userPassword
end
CLOSE MyCURSOR
DEALLOCATE MyCURSOR
select * from #tempuser

--有点麻烦,像是为了解决这个问题而写,没想出简单的好办法
drop table #tempuser

drop table #user
结果:



上面黄色标记的为开始逻辑错误的SQL语句查询。下面的记录是正确的!

由于时隔较久,一些表在本机早已不存在,所以采用了临时表。同时该方法我自己认为并不是一个好的解决办法,像是很牵强的在做题!也许大家会有好的办法。也希望共同学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: