以下是网上常见的一条删除数据库中重复记录的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)选出的是多条记录请各位大大指点下,谢谢了
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)选出的是多条记录请各位大大指点下,谢谢了
B表是只有一条纪录,即无重复纪录,A,B表的内容相同MAX实际上对于B表的每个ID来说,只会一个这样A表的ROWID只要不等于B表的ROWID的(AB表相同ID的),就全删了
所以它用了
where rowid not in
注意是not in而不是in
这样就把不是最大序号的数据全部删除了,只留下一条
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
A表是有多条重复纪录,B表是只有一条纪录(这是为什么,a,b本来就是一张表,数据应该是一样的)
你讲的有点高深了,能否讲的详细点,谢谢了。回2楼:
从3楼的结果可以看出max()选出的不只是一条记录。
from deleteTest b
where a.id=b.id and a.username=b.username and a.password=b.password這句保証了取出相同id,username,password記錄的行號﹐然后外部刪除不等于這個行號的數據﹐這樣理解就好了
这样出来的结果会一样嘛??!!!
select max(rowid)
from deleteTest b
where a.id=b.id and a.username=b.username and a.password=b.password
這部分是只會選出唯一的數據
如果其他的不在這部分內就刪除
B表每个ID可能也会有多条纪录
而A表也可能有多条纪录(应该比B表多)此语句的作用是把同一ID的的A表纪录保持一条,并保证是B表最新的纪录
如果B表每个ID只有一条纪录的话,不用MAX的,直接ROWID就行了
用MIN的话,则是取B表的最旧条纪录这个语句,有个前提,就是两张表的初始纪录一样