以下是网上常见的一条删除数据库中重复记录的SQL语句
delete from deleteTest a 
where rowid not in
(select max(rowid) 
from deleteTest b
where a.id=b.id and a.username=b.username and a.password=b.password)
用了后的确可以删除重复记录,但是有2点不明白:
1.该SQL语句是怎么选出重复记录的,这是一种什么连接方法
2.为什么select max(rowid)选出的是多条记录请各位大大指点下,谢谢了

解决方案 »

  1.   

    从语句来看,A表是有多条重复纪录
    B表是只有一条纪录,即无重复纪录,A,B表的内容相同MAX实际上对于B表的每个ID来说,只会一个这样A表的ROWID只要不等于B表的ROWID的(AB表相同ID的),就全删了
      

  2.   

    max()选出来的是一条记录
    所以它用了
    where   rowid   not   in 
    注意是not in而不是in
    这样就把不是最大序号的数据全部删除了,只留下一条
      

  3.   

    数据库中原有数据:
            ID USERNAME             PASSWORD
    ---------- -------------------- --------------------
             3 super                super
             3 super                super
             2 super                super
             2 super                super使用 
    select a.* from 
    deletetest a,deletetest b
    where a.id=b.id and a.username=b.username and a.password=b.password;
    查出的数据是:
            ID USERNAME             PASSWORD
    ---------- -------------------- --------------------
             2 super                super
             2 super                super
             2 super                super
             2 super                super
             3 super                super
             3 super                super
             3 super                super
             3 super                super使用:
    delete   from   deleteTest   a   
    where   rowid   not   in 
    (select   max(rowid)   
    from   deleteTest   b 
    where   a.id=b.id   and   a.username=b.username   and   a.password=b.password) 后再查询得到的数据是:        ID USERNAME             PASSWORD
    ---------- -------------------- --------------------
             3 super                super
             2 super                super
      

  4.   

    回1楼:
    A表是有多条重复纪录,B表是只有一条纪录(这是为什么,a,b本来就是一张表,数据应该是一样的)
    你讲的有点高深了,能否讲的详细点,谢谢了。回2楼:
    从3楼的结果可以看出max()选出的不只是一条记录。
      

  5.   

    select       max(rowid)       
    from       deleteTest       b   
    where       a.id=b.id       and       a.username=b.username       and       a.password=b.password這句保証了取出相同id,username,password記錄的行號﹐然后外部刪除不等于這個行號的數據﹐這樣理解就好了
      

  6.   

    那是不是也可以将,max(rowid)换成min(rowid)呢?!!
    这样出来的结果会一样嘛??!!!
      

  7.   

    呵呵,沒有注意NOT IN 
    select   max(rowid)   
    from   deleteTest   b 
    where   a.id=b.id   and   a.username=b.username   and   a.password=b.password
    這部分是只會選出唯一的數據
    如果其他的不在這部分內就刪除 
      

  8.   

    其实,确切的说应该是这样的
    B表每个ID可能也会有多条纪录
    而A表也可能有多条纪录(应该比B表多)此语句的作用是把同一ID的的A表纪录保持一条,并保证是B表最新的纪录
    如果B表每个ID只有一条纪录的话,不用MAX的,直接ROWID就行了
    用MIN的话,则是取B表的最旧条纪录这个语句,有个前提,就是两张表的初始纪录一样