liuyi8903(西西)的可以了 DELETE FROM TABLE_NAME WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)不过有资料说这种做法在50万以上的纪录时速度就无法忍受了。
delete form tabname where rowid>(select min(rowid) rowid from tabname where ...)
赫赫,偶说嘛,没看出哪里不对来啊jary12581的方法有点问题,如果有两个以上的记录有重复(不是指一个记录的重复条数)。liuyi8903的方法在删除某一特定重复纪录的时候可以使用。但要删掉表中所有重复行,我没想到有什么办法用一条SQL语句就搞定,哪位有解?偶觉得是这样的jary12581的方法 delete from tablename where rowid=(select max(rowid) from tablename group by 所有字段 having count(*)>=2) 这个是只删除一条重复记录时的写法 delete from tablename where rowid<(select max(rowid) from tablename group by 所有字段 having count(*)>=2) 这个是只保留一条重复记录时的写法,其余重复的都删了liuyi8903(西西)的这个偶觉得原理跟上面的第二种差不多, DELETE FROM TABLE_NAME WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)但是谁来告诉偶这句的意思 SELECT MAX(ROWID) FROM TABLE_NAME D WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……) TABLE_NAME D 这里的D不是一个别称吗? 这里的意思到底是实现表的自连接,还是什么???
嗯,我错了,liuyi8903的方法是可以的!学习!
liuyi8903(西西)的可以了 DELETE FROM TABLE_NAME WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)不过有资料说这种做法在50万以上的纪录时速度就无法忍受了。这个没错,但记录数多的时候确实无法忍受,所以在知道会出现哪种重复现象的时候,自己制定where语句; 其实还是多写几句,建个临时表什么的速度更快一些
还是有点不明白TABLE_NAME D TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND 这样就算是建立了自连接吗?
< SELECT MAX(ROWID) FROM TABLE_NAME D WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……) >这个sql有问题。用了别名后,table_name.col1不再是有效的标识符
DELETE FROM TABLE_NAME WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)这句,应该给外面的TABLE_NAME alias,里面的不需要DELETE FROM TABLE_NAME D WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME WHERE COL1=D.COL1 AND COL2=D.COL2 AND ……)
--< --SELECT MAX(ROWID) FROM TABLE_NAME D -- WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……) --> --这个sql有问题。用了别名后,table_name.col1不再是有效的标识符怎么解释,这个sql可以运行,结果也正确呀。
一个表temp
a b
1 1
1 1
2 2
2 2
2 2
然后删除多余的记录,使之变成
a b
1 1
2 2
事么?
delete from tablename where rowid=(select max(rowid) from tablename group by 所有字段 having count(*)>=2)
DELETE FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2)
感觉这个挺好
DELETE FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)不过有资料说这种做法在50万以上的纪录时速度就无法忍受了。
delete from tablename where rowid=(select max(rowid) from tablename group by 所有字段 having count(*)>=2)
这个是只删除一条重复记录时的写法
delete from tablename where rowid<(select max(rowid) from tablename group by 所有字段 having count(*)>=2)
这个是只保留一条重复记录时的写法,其余重复的都删了liuyi8903(西西)的这个偶觉得原理跟上面的第二种差不多,
DELETE FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)但是谁来告诉偶这句的意思
SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)
TABLE_NAME D
这里的D不是一个别称吗?
这里的意思到底是实现表的自连接,还是什么???
DELETE FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)不过有资料说这种做法在50万以上的纪录时速度就无法忍受了。这个没错,但记录数多的时候确实无法忍受,所以在知道会出现哪种重复现象的时候,自己制定where语句;
其实还是多写几句,建个临时表什么的速度更快一些
SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)
>这个sql有问题。用了别名后,table_name.col1不再是有效的标识符
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)这句,应该给外面的TABLE_NAME alias,里面的不需要DELETE FROM TABLE_NAME D
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME
WHERE COL1=D.COL1 AND COL2=D.COL2 AND ……)
--SELECT MAX(ROWID) FROM TABLE_NAME D
-- WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2 AND ……)
-->
--这个sql有问题。用了别名后,table_name.col1不再是有效的标识符怎么解释,这个sql可以运行,结果也正确呀。