select * from 表 a
where not exists (select * from 表 b where a.id=b.id and 
(a.col_a<b.col_a and a.col_b<a.col_b and a.col_c<b.col_c))

解决方案 »

  1.   

    select * 
    from table
    where id in(select max(id) as id,col_a,col_b,col_c from table group by col-a,col_b,col_c)
      

  2.   

    思路:
    先根据col_a,col_b,col_c进行Group By.并且取出Min(或者Max)的时间,这样就可以确保每三个存在的col_a,col_b,col_c的组合可以查询出一条(且仅有一条)记录.
    再用这个查询结果与原表进行连接,查出col_a,col_b,col_c相等并且时间也一致的记录,即可以得出所要的结果.示例语句如下:Select t.*
    From 
    [Table_Test] t,
    (
    Select col_a,col_b,col_c,Min(import_date) import_date
    From [Table_Test]
    Group By col_a,col_b,col_c
    ) tGrp
    Where t.col_a = tGrp.col_a And t.col_b = tGrp.col_b And t.col_c = tGrp.col_c
    And DateDiff(dd,t.import_date,tGrp.import_date)
      

  3.   

    最后一个条件少了一个"=0".
    应该是:
    And DateDiff(dd,t.import_date,tGrp.import_date) = 0
      

  4.   

    select * from tb a
    where import_date in (select top 1 import_date b
                          from tb where a.col_a=b.col_a 
               and a.col_b=b.col_b 
               and a.col_c=b.col_c
                          order by import_date)
      

  5.   

    首先感谢各位老大的指点,各位的思路我都明白了,给出的语句也都看清楚了,但还是有一个问题。各位都是用select语句把去重后的数据挑出来,但我的本意是要把表中的冗余数据去掉,保留下来没有冗余的数据。所以我以为这个语句应该是delete开始的,比如:delete from table_test where ... ...,用where条件把那些冗余数据挑出来,delete删掉它们。不知道我表达清楚没有,再次谢谢各位老大。
      

  6.   

    我以为直接把 lzhs 兄的指教:Select t.*
    From 
    [Table_Test] t,
    (
    Select col_a,col_b,col_c,Min(import_date) import_date
    From [Table_Test]
    Group By col_a,col_b,col_c
    ) tGrp
    Where t.col_a = tGrp.col_a And t.col_b = tGrp.col_b And t.col_c = tGrp.col_c
    And DateDiff(dd,t.import_date,tGrp.import_date)把其中的select t.* 改为delete即可,可行吗?
      

  7.   

    可以的......
    但是条件可能要稍微改一下.And DateDiff(dd,t.import_date,tGrp.import_date) <> 0就可以把"时间不等同于最小(或最大)时间"的记录Delete掉!
      

  8.   

    lzhs 兄,我发现datediff()函数无法起到预想的作用。表中数据是我用IFastLoad接口批量插入的,所以大量的行,它们的importdate值是相同的,比如{2006-02-21 11:05:00}。SQL在用datediff()进行比较时好象无法精确到毫秒级,虽然我在插入数据时已经设置了importdate字段中的毫秒值,但是在datediff()中指定第一个参数为ms好象不起作用,还是有相重的数据进来了。
      

  9.   

    DateDiff可以到millisecond级的,将"dd"改为"ms".
    具体可以参照SQL BOL里的DateDiff的说明哦.
      

  10.   

    ok, 事情到此基本已算解决。再次谢谢lzhs, 谢谢楼上其他的老大们。分已给出,请查收。