CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

请教一个sql分组查询的语句!

楼主hxg5588(狂学ASP.net)2005-08-02 18:21:53 在 MS-SQL Server / 基础类 提问

userid字段有很多重复的数据,想求一句sql只查询出该字段中重复的数据。谢谢!  
   
  例如:  
  userid  
  1  
  1  
  2  
  3  
  4  
  4  
  5  
   
  我查询的结果只求显示出  
  userid  
  1  
  1  
  4  
  4  
   
  这样的信息,不重复的通通不显示。  
   
  问题点数:50、回复次数:16Top

1 楼hxg5588(狂学ASP.net)回复于 2005-08-02 18:24:24 得分 0

另外还想在这句语句上能够删除重复的信息,只留一条,以达到userid字段不重复!Top

2 楼aw511(点点星灯)回复于 2005-08-02 18:25:45 得分 0

--参考  
  --选择表中字段值相同的记录,过滤不同的记录  
  declare   @User   table(Cid   int,Cname   varchar(50))  
   
  insert   @User(Cid,Cname)  
  values   (1,'企业合同工以上')  
  insert   @User(Cid,Cname)  
  values   (2,'编外工')  
  insert   @User(Cid,Cname)  
  values   (3,'实习生')  
  insert   @User(Cid,Cname)  
  values   (4,'临时工')  
  insert   @User(Cid,Cname)  
  values   (5,'编外工')  
   
  select   *   from   @User  
   
  select   *   from   @User   A  
  where   Exists   (select   1   from   @user   where   Cname=A.Cname   having   count(*)>1)  
   
   
  select     a.*     from     @User     as     a,(      
  select     Cname     from     @User     group     by     Cname      
  having     count(*)     >1      
  )     as     b      
  where     a.Cname=b.Cname      
  order     by     a.CnameTop

3 楼vivianfdlpw()回复于 2005-08-02 18:27:59 得分 0

select   *   from   表   t  
  where    
          (  
            select   count(1)   from   表    
            where   userid=t.userid  
          )>1Top

4 楼aw511(点点星灯)回复于 2005-08-02 18:30:31 得分 0

 
  declare   @t   table(userid   int)  
  insert   @t   values(1)  
  insert   @t   values(1)  
  insert   @t   values(2)  
  insert   @t   values(3)  
  insert   @t   values(4)  
  insert   @t   values(4)  
  insert   @t   values(5)  
   
  select   *   from   @t   A  
  where   Exists   (select   1   from   @t   where   userid=A.userid   having   count(*)>1)  
   
  select     a.*     from     @t     as     a,(      
  select     userid     from     @t     group     by     userid      
  having     count(*)     >1      
  )     as     b      
  where     a.userid=b.userid      
  order     by     a.userid  
   
  --两种方法Top

5 楼aw511(点点星灯)回复于 2005-08-02 18:32:08 得分 0

 
  删除重复数据      
     
  一、具有主键的情况      
  a.具有唯一性的字段id(为唯一主键)      
  delect     table          
  where     id     not     in          
  (      
  select     max(id)     from     table     group     by     col1,col2,col3...      
  )      
  group     by     子句后跟的字段就是你用来判断重复的条件,如只有col1,      
  那么只要col1字段内容相同即表示记录相同。      
     
  b.具有联合主键      
  假设col1+','+col2+','...col5     为联合主键      
  select     *     from         table     where     col1+','+col2+','...col5     in     (      
        select     max(col1+','+col2+','...col5)     from     table          
  where     having     count(*)>1      
  group     by     col1,col2,col3,col4          
  )      
  group     by     子句后跟的字段就是你用来判断重复的条件,      
  如只有col1,那么只要col1字段内容相同即表示记录相同。      
     
     
  or      
  select     *     from     table         where     exists     (select     1     from     table     x     where     table.col1     =     x.col1     and          
  table.col2=     x.col2     group     by     x.col1,x.col2     having     count(*)     >1)      
     
  c:判断所有的字段      
        select     *     into     #aa     from     table     group     by     id1,id2,....      
        delete     table          
        insert     into     table          
        select     *     from     #aa      
     
  二、没有主键的情况      
     
  a:用临时表实现      
  select     identity(int,1,1)     as     id,*     into     #temp     from     ta      
  delect     #temp          
  where     id     not     in          
  (      
        select     max(id)     from     #     group     by     col1,col2,col3...      
  )      
  delete     table     ta      
  inset     into     ta(...)      
            select     .....     from     #temp      
     
  b:用改变表结构(加一个唯一字段)来实现      
  alter     table     表     add         newfield     int     identity(1,1)      
  delete     表      
  where     newfield     not     in      
  (      
  select     min(newfield)     from     表     group     by     除newfield外的所有字段      
  )      
     
  alter     table     表     drop     column     newfield      
   
  Top

6 楼hxg5588(狂学ASP.net)回复于 2005-08-02 21:30:46 得分 0

有没有哪为大虾写得稍微易懂点啊?Top

7 楼aw511(点点星灯)回复于 2005-08-02 21:39:07 得分 0

上面写的你那里不懂啊!!       请标明,我跟你解释.  
   
  删除数据给出了方法,但你没有具体的数据,我不好写.Top

8 楼hxg5588(狂学ASP.net)回复于 2005-08-02 21:45:46 得分 0

看到你回贴,太感谢了!  
  我数据库不是很熟悉。这样把,我写个表啊  
   
  userid       username         text  
  001                 aaa               111  
  001                 aaa               111  
  002                 bbb               222  
  003                 ccc               333  
  003                 ccc               333  
  004                 ddd               444  
  005                 eee               555  
  005                 eee               555  
   
  例如以上这个表啊,001、003、005这几行是重复的吧,我现在要过滤到重复的内容,过滤以后的表如下:  
  userid       username         text  
  001                 aaa               111  
  002                 bbb               222  
  003                 ccc               333  
  004                 ddd               444  
  005                 eee               555  
   
   
  谢谢啊!点点星灯老大:)Top

9 楼vivianfdlpw()回复于 2005-08-02 21:53:11 得分 0

select   distinct   *   from   表Top

10 楼hxg5588(狂学ASP.net)回复于 2005-08-02 21:55:28 得分 0

不啊,这样只是选择出这些数据,但是我要彻底的删除重复的数据,让我的表中没有重复数据!~Top

11 楼lisiyong(小样)回复于 2005-08-02 23:01:04 得分 0

create     table   t#(userid   varchar(10),uername   varchar(10),text     varchar(10))  
   
  insert     into     t#(userid   ,uername   ,text     )  
  values('001','aaa','111')  
  insert     t#(userid   ,uername   ,text     )  
  values('001','aaa','111')  
  insert     t#(userid   ,uername   ,text     )  
  values('002','bbb','222')  
  insert     t#(userid   ,uername   ,text     )  
  values('003','ccc','333')  
  insert     t#(userid   ,uername   ,text     )  
  values('003','ccc','333')  
  insert     t#(userid   ,uername   ,text     )  
  values('005','eee','555')  
  insert     t#(userid   ,uername   ,text     )  
  values('005','eee','555')  
     
   
   
   
  delete     from     t#     where     NOT   EXISTS   (select       distinct   *     from     t#   )  
   
   
  select   *   from   t#  
  Top

12 楼gimy007(逮猫的耗子)回复于 2005-08-03 08:17:36 得分 0

select   *   from   t   where   userid   in(select   userid   from   t   group   by   userid   having   count(userid)>1)Top

13 楼aw511(点点星灯)回复于 2005-08-03 19:51:53 得分 0

 
  --创建测试数据  
  CREATE   TABLE   [tttt]   (  
  [userid]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [username]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [text]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL    
  )   ON   [PRIMARY]  
  GO  
   
  insert   tttt   values('001','aaa','111')  
  insert   tttt   values('001','aaa','111')  
  insert   tttt   values('002','bbb','222')  
  insert   tttt   values('003','ccc','333')  
  insert   tttt   values('003','ccc','333')  
  insert   tttt   values('004','ddd','444')  
  insert   tttt   values('005','eee','555')  
  insert   tttt   values('005','eee','555')  
   
  --查看  
  select   *   from   tttt  
   
   
  --要删除重复的数据,加了一个自动增长列  
  select     identity(int,1,1)     as     id,*     into     #temp     from     tttt  
  --select   *   from   #temp  
  delete   from   #temp        
  where     id     not     in          
  (      
        select     max(id)     from     #temp     group     by     userid,username      
  )    
   
  --select   *   from   #temp  
  ---过滤好了所有的数据,开始删除原来的数据,导入新的数据  
  delete   from   tttt  
  insert   tttt  
  select   Userid,username,text   from   #temp  
   
  drop   table   #temp  
  --查看结果  
  select   *   from   tttt  
   
  --删除表  
  drop   table   tttt  
   
   
  ---如果你想知道怎么来的,就自己一步一步的查看Top

14 楼qxq321()回复于 2005-08-03 21:51:18 得分 0

这样的啊,直接使用临时表可以来完成的:  
  select   *   into   a   from   tb  
  truncate   tb  
  insert   into   tb   select   *   from   a  
  drop   table   a  
  Top

15 楼QQMagicer(在IT的路上越走越远)回复于 2005-08-04 11:19:41 得分 0

select     userid,count(*)  
  from   tttt  
  group   by   userid  
  having   count(*)>1  
  --这个可以选出重复的行  
  delete   from   tttt  
  group   by   userid  
  having   count(*)>1  
  --这个可以删除重复的行  
   
   
  Top

16 楼QQMagicer(在IT的路上越走越远)回复于 2005-08-04 11:30:51 得分 0

不好意思,借用一下   aw511(点点星灯)   的数据结构和数据,在修改一下结果  
   
  CREATE   TABLE   [tttt]   (  
  [userid]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [username]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [text]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL    
  )   ON   [PRIMARY]  
  GO  
   
  insert   tttt   values('001','aaa','111')  
  insert   tttt   values('001','aaa','111')  
  insert   tttt   values('002','bbb','222')  
  insert   tttt   values('003','ccc','333')  
  insert   tttt   values('003','ccc','333')  
  insert   tttt   values('004','ddd','444')  
  insert   tttt   values('005','eee','555')  
  insert   tttt   values('005','eee','555')  
   
  select   *   from   tttt  
   
   
  select   *   from   tttt  
  where   userid   in(  
  select     userid  
  from   tttt  
  group   by   userid  
  having   count(*)>1)  
   
   
  查询结果--------  
  001 aaa 111  
  001 aaa 111  
  003 ccc 333  
  003 ccc 333  
  005 eee 555  
  005 eee 555  
  -----------  
   
  不知道是不是这样子的  
   
  如果要删除重复数据又要选择那些不重复的数据为什么不执行两步,反正也是要写一个存储过程  
   
   
   
  Top

相关问题

  • sql语句,两次分组查询
  • SQL查询语句
  • Sql 查询语句
  • SQL查询语句
  • sql语句查询
  • sql查询语句
  • sql查询语句
  • SQL查询语句
  • Sql查询语句
  • sql查询语句

关键词

  • 字段
  • 查询
  • 数据
  • uername
  • userid
  • cname
  • col
  • 重复
  • newfield
  • insert

得分解答快速导航

  • 帖主:hxg5588

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo