有一个表没有主键约束,主键有重复,但是别的字段不一样,比如流水号就不一样。现在我要删除重复记录,保留重复记录中的一条,请问这样的SQL如何写效率不较高,谢谢!!

解决方案 »

  1.   

    这样当然可以,但是我本意不是这样。这个表接收数据应该是33条,但是由于SAP发送重复,现在是66条,原因是这个表没有主键约束,我现在想查询得到原本的33条记录,后面重复发的33条我不需要。明白我意思吗?但是主键重复的记录数有的字段是不一样,不是完全一样的那种重复。
      

  2.   


    idxno           mq_lsh mq_sendtime5000060376       27149 2013-08-14 23:05:56
    5000060376       27182 2013-08-14 23:06:06
    5000060377       27150 2013-08-14 23:05:56
    5000060377       27183 2013-08-14 23:06:06
    5000060378       27151 2013-08-14 23:05:56
    5000060378       27184 2013-08-14 23:06:06
    5000060379       27152 2013-08-14 23:05:56
    5000060379       27185 2013-08-14 23:06:06如上所示:我想删除重复的保留重复的一条就可以,这样的SQL怎么写?跪求
      

  3.   

    既然有时间,根据时间去删,第一批数据和第二批数据的发送时间不一样,我们跟SAP交互也出现过这种情况
      

  4.   

     这个问题已经搞定了,其实想明白了很简单的,刚开始想的太复杂了,语句:
    select idxno,max( mq_lsh) mq_lsh
    from saptomz:o_tpc08_ordermst
    where makedate=today-1
    group by idxno
    没了,不过还是谢谢回复我的朋友们,谢谢你们!!
      

  5.   

    if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
    CREATE TABLE #temp(idxno varchar(100), mq_lsh int, mq_sendtime datetime)
    insert #temp
    select '5000060376','27149','2013-08-14 23:05:56' union all
    select '5000060376','27182','2013-08-14 23:06:06' union all
    select '5000060377','27150','2013-08-14 23:05:56' union all
    select '5000060377','27183','2013-08-14 23:06:06' union all
    select '5000060378','27151','2013-08-14 23:05:56' union all
    select '5000060378','27184','2013-08-14 23:06:06' union all
    select '5000060379','27152','2013-08-14 23:05:56' union all
    select '5000060379','27185','2013-08-14 23:06:06' 
    --如果2005及以上的话
    ;WITH cte AS
    (
    SELECT rowid=ROW_NUMBER() OVER(PARTITION BY idxno ORDER BY mq_sendtime, mq_lsh), * FROM #temp
    )
    delete FROM cte
    WHERE rowid <> 1SELECT * FROM #temp
    /*
    idxno mq_lsh mq_sendtime
    5000060376 27149 2013-08-14 23:05:56.000
    5000060377 27150 2013-08-14 23:05:56.000
    5000060378 27151 2013-08-14 23:05:56.000
    5000060379 27152 2013-08-14 23:05:56.000
    */
      

  6.   

    先查询要删除的记录:
    select *
    from tb
    where mq_lsh mq_sendtime
    not in(
    select min( mq_lsh mq_sendtime) as  mq_lsh mq_sendtime
    from tb 
    group by idxno)如果正确,再删除
    delete from tb
    where mq_lsh mq_sendtime
    not in(
    select min( mq_lsh mq_sendtime) as  mq_lsh mq_sendtime
    from tb 
    group by idxno)
      

  7.   

    楼上那个用oracle写的你的这个思路也可以,但是你想想如果重复的记录数是千万级别的,你还这样一个个select吗?不过这个已经搞定了,谢谢你的帮助。受益匪浅,呵呵