我有一个视图,里面有个字段ID可能会重复出现,我怎样才能只取一条记录出来?我用
Distinct试了,好像不行.视图中也没有唯一的字段,请大家帮忙!

解决方案 »

  1.   

    10 fd 1 4 0 1 0 0 0 1 1 34 2007-01-17 02:02:00 3 7 0
    11 fd 1 4 0 1 0 0 0 1 1 34 2007-01-17 02:02:00 3 NULL NULL
    12 fd 1 4 0 1 0 0 0 1 1 34 2007-01-17 02:02:00 3 83 1
    13 fd 1 4 0 1 0 0 0 1 1 34 2007-01-17 02:02:00 3 82 0
    13 fd 1 4 0 1 0 0 0 1 1 34 2007-01-17 02:02:00 3 85 1
    14 fd 1 4 0 1 0 0 0 1 1 34 2007-01-17 02:02:00 3 81 1
    15 fd 1 4 0 1 0 0 0 1 1 34 2007-01-17 02:02:00 3 80 1
    16 fd 1 4 0 1 0 0 0 1 1 34 2007-01-17 02:02:00 3 NULL NULL
    17 fd 1 4 0 1 0 0 0 1 1 34 2007-01-17 02:02:00 3 NULL NULL
      

  2.   

    里面有个字段ID可能会重复出现
    -----------------------------
    除了ID,其他字段重复吗?
    你取出的结果集,难道只取这个ID字段?
    如果只要取ID,Distinct没问题。如果还要取其他字段,同一ID其他字段值不同的话,Distinct没用
      

  3.   

    select ID,min(字段2),min(字段3)...
    group by ID...不知道你是不是要这样的
      

  4.   

    加个自增长ID,作为唯一ID再按有重复字段的ID分组去自增长ID最大或者最小的
      

  5.   

    是啊,ID同,后面一大串也都同,就是最后两个字段不同.我想不出好办法了.min 或max也没用
      

  6.   

    select 相同的字段,min(不同的字段)。。
    group by 相同的字段
      

  7.   

    select 相同的字段,min(不同的字段)。。
    group by 相同的字段
    select top 1 * from 表 where 列名='##'
      

  8.   

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

  9.   

    --根据楼主的要求,这样就可以了
    select identity(int,1,1) as autoID, * into #Tmp from tablenameselect min(autoID) as autoID 
    into #Tmp2 
    from #Tmp 
    group by [ID]truncate table tablename
    insert tablename select * from #Tmp where autoID in(select autoID from #tmp2)
      

  10.   

    delele from tbName a 
     where a.rowid < 
     (
       select max(b.rowid) from tbName b
        where a.col1 = b.col2
          and a.col2 = b.col2
             ...............
     )
    如果表中所用字段相同,就全部列都要相等
      

  11.   

    delete from tbName where rowid in 
      (
        select arowid from 
        (
         select 
           t.rowid as arowid,
           row_number() over(partition by col1,col2 ... order by t.rowid) as rn
           from tbName t 
        ) where rn>=2
      )
     同理,根据order by 优先选择保留的记录