使用中这两个运算符都能够达到去除重复项的目的。
了解到order by 的三值运算后,很希望了解一些distinct的处理机制。
希望对以后去除重复项时(效率方面),做到心中有数。请各位高人能帮忙答疑一下。谢谢哦!

解决方案 »

  1.   

    最高效的删除重复记录方法 ( 因为使用了ROWID)例子: 
    DELETE  FROM  EMP E  WHERE  E.ROWID > (SELECT MIN(X.ROWID) 
    FROM  EMP X  WHERE  X.EMP_NO = E.EMP_NO);
      

  2.   

    我只想说一句 慎用distinct
      

  3.   

    DISTINCT 是完全重复才能去除,其实DISITNCT 也会排序,具体你可以参考执行计划,
    去重的有精华帖子,你可以参考一下
      

  4.   

    distinct这个关键字用来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。 
    下面先来看看例子: table表 字段1      字段2 
        id         name 
        1            a 
        2            b 
        3            c 
        4            c 
        5            b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。 比如我想用一条语句查询得到name不重复的所有数据,那就必须 使用distinct去掉多余的重复记录。 select distinct name from table 
    得到的结果是: ---------- name 
        a 
        b 
        c 好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧: select distinct name, id from table 结果会是: ---------- id name 
        1 a 
        2 b 
        3 c 
        4 c 
        5 b distinct怎么没起作用?作用是起了的,不过他同时作用了两个 字段,也就是必须得id与name都相同的才会被排除 我们再改改查询语句: select id, distinct name from table 很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。 -------------------------------------------------------- 下面方法可行: select *, count(distinct name) from table group by name 结果:     id name count(distinct name) 
        1 a 1 
        2 b 1 
        3 c 1 最后一项是多余的,不用管就行了,目的达到 group by 必须放在 order by 和 limit之前,不然会报错 
      

  5.   

    下面方法可行: select *, count(distinct name) from table group by name 结果:     id name count(distinct name) 
        1 a 1 
        2 b 1 
        3 c 1 最后一项是多余的,不用管就行了,目的达到 group by 必须放在 order by 和 limit之前,不然会报错 

    也不行
      

  6.   

    distinct只有用二重循环查询来解决,是否指的是这个例子select distinct name, id from table 
    结果会是: 
    ---------- id name 
        1 a 
        2 b 
        3 c 
        4 c 
        5 b 这里说的二重循环查询,是否产生了两个中间过程表呢?还是什么游标的方式处理的呢?
    id 
    1
    2
    3
    4
    5和name
    a
    b
    c