表明(CICI_CESHI)
IDS   NAMES     TEACHERNAME  SEX  CLASSROOM   (列名)
1   测试1名字     null       男     null      (数据1)
1   测试1名字   测试1老师    男   测试1房间   (数据2)
2   测试2名字   测试2老师    女   测试2房间   (数据3)
3   测试3名字   测试3老师    女   测试3房间   (数据4)
3   测试3名字   测试3老师    女   测试3房间   (数据5)
3   测试3名字   测试3老师    女   测试3房间   (数据6)前提上面这几个数据总是测试用的,真正的数据上万条。删除多余的我打个比方:
删除重复数据1,5和6。删除1是因为数据2比数据1的内容全,数据4,5,6因为数据内容一样,所以删除那两个都无所谓。
请各位高手帮帮忙,谢谢了,把具体的sql语句写下。谢谢了。跪求可以解决的sql语句。

解决方案 »

  1.   

    select *
      from (select t.ids,
                   t.names,
                   t.teachername,
                   t.sex,
                   t.classroom,
                   row_number() over(partition by t.ids order by t.ids, t.names nulls last, t.teachername nulls last, t.sex nulls last, t.classroom nulls last) rn
              from CICI_CESHI t)
     where rn = 1;
      

  2.   

    有没有这样的情况呢? 我该保留那条呢?
    1 测试1名字 null 男 测试1房间 (数据1)
    1 测试1名字 测试1老师 男 null (数据2)
    1 测试1名字 测试1老师 null 测试1房间 (数据3)
      

  3.   

    delete from CICI_CESHI  a where not exists(select 1 from CICI_CESHI b
    where a.IDS=b.IDS and a.NAMES=b.NAMES and a.rowid>b.rowid)or
     
    delete from CICI_CESHI  a 
    where a.rowid not in(select max(b.rowid) from CICI_CESHI b group by b.IDS,b.NAMES)
      

  4.   

    你们咋都没考虑情况啊?如果按monitoy方法,楼主,这样的数据,你想要哪条?
    1 测试1名字 null 男 测试1房间 (数据1)
    1 测试1名字 测试1老师 null null (数据2)好像你这个不确定NAMES TEACHERNAME SEX CLASSROOM 的哪些是比较全的吧
    你这个内容全,有点无规则?
      

  5.   

    首先你的表结构设计的有问题,每张表最好都要有主键。
    如果只是为了修正数据不是一个常态操作可以采用中间建立一个临时表
    create table tmp_1 as select distinct * from CICI_CESHI ;
    然后清空CICI_CESHI  
    再insert into CICI_CESHI  select * from tmp_1;
      

  6.   

     不好意思,是我说的有bug,这样说吧    表明(CICI_CESHI)
    IDS   NAMES    TEACHERNAME  SEX      CLASSROOM  (列名)
    1   测试1名字 测试1老师     男         null    (数据1)
    1   测试1名字 测试1老师     男      测试1房间 (数据2)
    2   测试2名字 测试2老师     女      测试2房间 (数据3)
    3   测试3名字 测试3老师     女      测试3房间 (数据4)
    3   测试3名字 测试3老师     女      测试3房间 (数据5)
    3   测试3名字 测试3老师     女      测试3房间 (数据6)除了classroom这个列,其他都是必填项。要是删除数据1和数据2的时候,判断classroom是否为空,删除为空的。如果都为空的话,随便删除一个就可以了。 不好意思。
      

  7.   

    --修改下minitoy的就好了
    select *
      from (select t.ids,
                   t.names,
                   t.teachername,
                   t.sex,
                   t.classroom,
                   row_number() over(partition by t.ids order by t.classroom nulls last) rn
              from CICI_CESHI t)
     where rn = 1;