在网页上经常看到查找或者删除重复记录的高效方法,比如:
SELECT *  FROM emp a
 WHERE a.ROWID >
       (SELECT MIN(b.ROWID) FROM emp b WHERE b.rybh = a.rybh)但是没有找到要select过滤掉重复记录后的表记录高效语句怎么写,
1.  select * from emp where rybh not in
(SELECT *  FROM emp a
 WHERE a.ROWID >
       (SELECT MIN(b.ROWID) FROM emp b WHERE b.rybh = a.rybh))
select * from emp a where not exists select2.  SELECT *
          FROM dt_a_al_gjjgrzhxx a
         WHERE NOT EXISTS
         (SELECT 'X'
                  FROM (SELECT a.rybh
                          FROM dt_a_al_gjjgrzhxx a
                         WHERE a.ROWID > (SELECT MIN(b.ROWID)
                                            FROM dt_a_al_gjjgrzhxx b
                                           WHERE b.rybh = a.rybh)) c
                 WHERE c.rybh = a.rybh)好像都不是很快,请高手赐教,十分感谢!

解决方案 »

  1.   

    select distinct效率不能接受吗?
      

  2.   

    因为很多网站都说distinct效率不是很高,所以
      

  3.   

    try:SELECT *  FROM emp a
     WHERE a.ROWID =
           (SELECT MIN(b.ROWID) FROM emp b WHERE b.rybh = a.rybh);
      

  4.   

    sorry,开头写错了,是:
    1.  select * from emp where rowid not in
    (SELECT rowid  FROM emp a
     WHERE a.ROWID >
           (SELECT MIN(b.ROWID) FROM emp b WHERE b.rybh = a.rybh))
    select * from emp a where not exists select2.  SELECT *
              FROM dt_a_al_gjjgrzhxx a
             WHERE NOT EXISTS
             (SELECT 'X'
                      FROM (SELECT a.rowid                          
                            FROM dt_a_al_gjjgrzhxx a
                             WHERE a.ROWID > (SELECT MIN(b.ROWID)
                                                FROM dt_a_al_gjjgrzhxx b
                                               WHERE b.rybh = a.rybh)) c
                     WHERE c.rowid = a.rowid)这两种都觉得不算快
      

  5.   

    or:select a.* from emp a,
    (SELECT MIN(b.ROWID) FROM emp b group by b.rybh) b
    where a.rowid=b.rowid;
      

  6.   

    to  bzszp(SongZip) : 多谢!这个的确很快,怎么早没想到,高手!
      

  7.   

    应该是第一个更快。
    如果rybh 列使用了索引的话。
      

  8.   

    第二种报错:
    ora-01446:无法从含distinct,group by等子句的视图中选择rowid
      

  9.   

    rowid不在group by中,所以好像不行。
      

  10.   

    sorry:
    漏掉了别名select a.* from emp a,
    (SELECT MIN(b.ROWID) rid FROM emp b group by b.rybh) b
    where a.rowid=b.rid;自己测一下吧。
      

  11.   

    哦,不是这个问题
    第二个要给rowid起个别名就好了:
      SELECT *
              FROM dt_a_al_gjjgrzhxx a,
             (SELECT MIN(b.ROWID) row_id
                FROM dt_a_al_gjjgrzhxx b
               GROUP BY b.rybh) b
             WHERE a.ROWID = b.ROW_id 第一种0.062秒,第二种3.016
      

  12.   

    'set rs=cnn.execute("SELECT top 8 a.Hotelname,a.LinkURL,b.price1 FROM hotel a,hotel_price b WHERE a.HotelID=b.HotelID order by a.HotelID desc")