论坛首页 入门技术论坛

一道不错的数据库面试题

浏览 8396 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-08   最后修改:2009-07-08
因为见有人发了数据库的面试题,所以想起我去年面试时候遇到的一个面试题,因为当时没有答出来,所以比较深刻。
题目是这样的:有一个数据库表peope,表有字段name,age,address三个属性(注:没有主键)。现在如果表中有重复的数据,请删去重复只留下其中的一条。重复的定义就是两条记录的name,age,address值都一样。

这道题的关键是怎么把重复的数据过滤掉,后来我考虑的做法是这样的:
select * from people group by name,age,address having COUNT(DISTINCT name)=1


这样就可以把重复的数据过滤掉,然后把这些数据插入到一个临时表中,删去原表中的所有数据,再把临时表中的数据插回来就可以了。

1. CREATE TEMPORARY TABLE tmp_table select * from people group by name,age,address having COUNT(DISTINCT name)=1
2. delete from people
3. insert into people select * from tmp_table


不知道大家还有什么好的方法说出来分享一下!

   发表时间:2009-07-08   最后修改:2009-07-08
刚刚看到了这条SQL select DISTINCT * from people ,哈哈,应该是这么做的,我以前想法复杂了~~。以前尝试过select DISTINCT (*) from people语法错误,以为不可行。汗~~
0 请登录后投票
   发表时间:2009-07-09   最后修改:2009-07-13
没人气,不回复。
0 请登录后投票
   发表时间:2009-12-06  
2. delete from people  可变为:truncate table people.

还有一种简单的方式(效率不一定比上面的好,但也不一定差,要看具体数据冗余的程度),对于oracle,使用rowid:
delete from people where rowid not in (select max(rowid) from people t group by name,age,address);
注意:max(rowid)可以换成min(rowid)。

其实也可写为如下:
create table temp_people as (select distinct * from people);
truncate table people;--truncate 效率比delete高
insert into people select * from temp_people;
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics