梦幻之旅

DEBUG - 天道酬勤

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  671 随笔 :: 6 文章 :: 256 评论 :: 0 Trackbacks
记得两年前我的老师给我出了一道题目:
假如有一张users表,里面有user_id,user_name两个字段,用一条sql语句去掉数据库里的userName重复的记录.
当时想了很久,都没想出答案.今天突然想起这个问题,想到了两种实现.

1.delete from users a  where a.user_id = (select max(b.user_id) from users b where a.user_name=b.user_name);
这一种自联接,效率低一点.

2.delete from users where user_id not in(select max(user_id) from users group by user_name having count(user_name)>=1);
这一种先分组,效率高一些.
在此作下符号,希望对同行的朋友们有所启示.

posted on 2008-07-25 14:10 HUIKK 阅读(8571) 评论(7)  编辑  收藏 所属分类: DataBase

评论

# re: 一条sql 数据库 去重 2008-07-25 14:18 大鸟
是userName重复的数据,不是user_id重复的数据,所以感觉这个答案有问题....  回复  更多评论
  

# re: 一条sql 数据库 去重 2008-07-25 14:25 隔叶黄莺
作者的主键就是 user_id+user_name的,没问题。  回复  更多评论
  

# re: 一条sql 数据库 去重 2008-07-25 15:47 庞永庆
你好 我是出版社的编辑,我看到你博客中的内容。现在想出版一本SQL的书。如果想把这些内容和更多的人分享,可以和我联系,把这些东西写成书。
我的邮箱:books_522008@yahoo.com.cn
或者加我的MSN:pyq_19852008@hotmail.com  回复  更多评论
  

# re: 一条sql 数据库 去重 2008-07-25 17:50 Yata
要是id不是主键的话,你的SQL就有问题了,我是这样写的:

delete from test A
where
A.id != (select B.id from (select max(C.id) as id,C.name from test C group by C.name) B where B.Name = A.name)

我用的表名是test,字段是id和name。  回复  更多评论
  

# re: 一条sql 数据库 去重 2008-07-26 09:08 way
你的答案调不通  回复  更多评论
  

# re: 一条sql 数据库 去重 2010-04-25 19:02 dupidog
第一种=要改成<>吧
第二种having字句没必要?没看出来having字句有什么用  回复  更多评论
  

# re: 一条sql 数据库 去重 2012-04-04 14:12 xzdream
2.delete from users where user_id not in(select max(user_id) from users group by user_name having count(user_name)>=1);
是不是不加not呀,楼主  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: