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

求一sql语句,怎么来除掉重复记录.小弟先过大家

楼主chenxiaoguo20(chenxiaoguo20)2004-12-03 07:53:10 在 MS-SQL Server / 基础类 提问

各位高手:  
  我有:"select   序号,日期,用量   from   abc   where   序号=1"   语句/  
  现在我改为:"select   序号,distinct   日期,用量   from   abc   where   表号=1"    
  为什么不对???  
  我的目的只是实现:在一天中只查询出一条记录,将一天中多余重复记录去掉,这样怎么实现???请大家帮帮我,小弟先谢过大家. 问题点数:0、回复次数:11Top

1 楼yesyesyes()回复于 2004-12-03 07:58:32 得分 0

同一天如果有相同的用量怎么处理呢?因为你还有序号.Top

2 楼jingxijun(一笑)回复于 2004-12-03 08:05:00 得分 0

有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。  
            1、对于第一种重复,比较容易解决,使用  
            select   distinct   *   from   tableName  
            就可以得到无重复记录的结果集。  
            如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除  
            select   distinct   *   into   #Tmp   from   tableName  
            drop   table   tableName  
            select   *   into   tableName   from   #Tmp  
            drop   table   #Tmp  
            发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。  
             
            2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下  
            假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集  
            select   identity(int,1,1)   as   autoID,   *   into   #Tmp   from   tableName  
            select   min(autoID)   as   autoID   into   #Tmp2   from   #Tmp   group   by   Name,autoID  
            select   *   from   #Tmp   where   autoID   in(select   autoID   from   #tmp2)  
            最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)Top

3 楼jingxijun(一笑)回复于 2004-12-03 08:09:09 得分 0

select   identity(int,1,1)   as   autoID,   *   into   #t1   from   abc  
  select   min(autoID)   as   autoID   into   #t2   from   #t1   group   by   日期  
  select   *   from   #t1   where   autoID   in   (select   autoID   from   #t2)Top

4 楼zzy928()回复于 2004-12-03 08:16:48 得分 0

你所指的表号   =   1  
  是指表号是你要查询的表中的一个列  
  还是指你要查询的是表号1呢?  
  对不起  
  有点看不懂Top

5 楼yingqing(曾明)回复于 2004-12-03 08:34:48 得分 0

語法有問題,distinct不能夠放在字段中間和字段後面,呵呵Top

6 楼goodboycwy(霸王别姬)回复于 2004-12-03 08:41:24 得分 0

这是从蚂蚁那里学过来的:  
  去除重复值  
  如果有ID字段,就是具有唯一性的字段  
   
  delect   table   where   id   not   in   (  
   
      select   max(id)   from   table   group   by   col1,col2,col3...  
  )  
  group   by   子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。  
   
   
   
  2,如果是判断所有字段也可以这样  
      select   *   into   #aa   from   table   group   by   id1,id2,....  
      delete   table    
      insert   into   table    
      select   *   from   #aa  
   
   
   
  3,没有ID的情况  
   
  select   identity(int,1,1)   as   id,*   into   #temp   from   tabel  
  delect   #   where   id   not   in   (  
      select   max(id)   from   #   group   by   col1,col2,col3...)  
  delect   table  
  inset   into   table(...)  
        select   .....   from   #temp  
   
   
  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字段内容相同即表示记录相同。  
   
  2,  
  select   identity(int,1,1)   as   id,*   into   #temp   from   tabel  
  select   *   from     #temp   where   id   in   (  
      select   max(id)   from   #emp   where   having   count(*)>1   group   by   col1,col2,col3...)  
   
   
   
   
   
  删除重复的,只留一条:  
   
  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  
   
   
   
   
   
  select   distinct   *   into   #temp   from   表  
  truncate   table   表  
  insert   表   select   *   from   #temp  
  drop   table   #temp  
   
   
   
  Top

7 楼szsmall(麒麟)回复于 2004-12-03 08:52:44 得分 0

select   distinct   日期   from   abc   where   表号=1Top

8 楼chenxiaoguo20(chenxiaoguo20)回复于 2004-12-03 09:18:40 得分 0

更正,那"表号"就是"序号"我写错了.Top

9 楼chenxiaoguo20(chenxiaoguo20)回复于 2004-12-03 10:15:01 得分 0

各位高手,我是在程序里用到sql语句:  
  现在用;select   identity(int,1,1)   as   autoID,   *   into   #Tmp   from   tableName  
            select   min(autoID)   as   autoID   into   #Tmp2   from   #Tmp   group   by   Name,autoID  
            select   *   from   #Tmp   where   autoID   in(select   autoID   from   #tmp2)  
  程序中怎么才能用到一条语句来实现???  
  也就是说我只能用一知语句来完成.可以上是三条语句,怎样才可以压到一条语句中???请各位指点.  
  Top

10 楼zling1981(struts+spring_hibernate!!☆☆☆☆☆)回复于 2004-12-03 10:18:51 得分 0

新增一个标识列,利用它来删除重复纪录:  
      ALTER     TABLE     T1  
      ADD     key_col     INT   NOT   null     IDENTITY  
      DELETE     FROM     T1  
      WHERE     EXISTS  
                  (      
                  SELETE   *  
                FROM   T1   AS   T2  
                WHERE     T2.C1=T1.C1     AND     T2.C2=T1.C2  
                AND     T2.key_col>   t1.key_col  
              ALTER     TABLE     T1  
              DROP       column     key_col  
  Top

11 楼long0104()回复于 2004-12-03 10:26:33 得分 0

如果有ID字段,就是具有唯一性的字段  
   
  delect   table   where   id   not   in   (  
   
      select   max(id)   from   table   group   by   col1,col2,col3...  
  )  
  group   by   子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。  
   
   
   
  2,如果是判断所有字段也可以这样  
      select   *   into   #aa   from   table   group   by   id1,id2,....  
      delete   table    
      insert   into   table    
      select   *   from   #aa  
   
   
   
  3,没有ID的情况  
   
  select   identity(int,1,1)   as   id,*   into   #temp   from   tabel  
  delect   #   where   id   not   in   (  
      select   max(id)   from   #   group   by   col1,col2,col3...)  
  delect   table  
  inset   into   table(...)  
        select   .....   from   #temp  
   
   
  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字段内容相同即表示记录相同。  
   
  2,  
  select   identity(int,1,1)   as   id,*   into   #temp   from   tabel  
  select   *   from     #temp   where   id   in   (  
      select   max(id)   from   #emp   where   having   count(*)>1   group   by   col1,col2,col3...)  
   
   
   
   
   
  删除重复的,只留一条:  
   
  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  
   
   
   
   
   
  select   distinct   *   into   #temp   from   表  
  truncate   table   表  
  insert   表   select   *   from   #temp  
  drop   table   #temp  
   
   
   
   
  Top

相关问题

  • 请教插入记录的sql语句
  • Sql语句错误:记录过大
  • 批量删除记录SQL语句。
  • SQL语句问题,有相同记录
  • 关于SQL语句的记录
  • 多表求记录总和sql语句编写?
  • 一个关于记录集或SQL语句的问题
  • 如何用SQl语句的update更新当前的记录。
  • 如何用SQL语句每隔3行取出一条记录?
  • 将重复记录提取出来(不能用SQL语句)

关键词

  • 字段
  • 语句
  • 查询
  • autoid
  • col
  • 重复
  • 记录
  • newfield
  • 表号
  • 子句后跟

得分解答快速导航

  • 帖主:chenxiaoguo20

相关链接

  • SQL Server类图书

广告也精彩

反馈

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