浏览 8407 次
锁定老帖子 主题:一道不错的数据库面试题
精华帖 (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 不知道大家还有什么好的方法说出来分享一下! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-08
最后修改:2009-07-08
刚刚看到了这条SQL select DISTINCT * from people ,哈哈,应该是这么做的,我以前想法复杂了~~。以前尝试过select DISTINCT (*) from people语法错误,以为不可行。汗~~
|
|
返回顶楼 | |
发表时间:2009-07-09
最后修改:2009-07-13
没人气,不回复。
|
|
返回顶楼 | |
发表时间: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; |
|
返回顶楼 | |