下面是查询重复数据的一个例子:
8 I: x% h+ B* |) U8 t: [8 X) _ select a.rowid,a.* from 表名 a+ O4 z M6 K& q7 ?% g
where a.rowid !=
/ _* z; a+ Z+ d& G (, j* c" ^2 H; Q
select max(b.rowid) from 表名 b
% O `, z7 A0 o |0 D5 @" } where a.字段1 = b.字段1 and" d, i, d6 J' s
a.字段2 = b.字段2
2 x/ d- }/ ?1 F/ y6 w )
7 {0 |4 u1 t. N! P2 V' p5 h y2 { 下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。
}& J: t' F6 n' j9 F! u 而外面就是查询出除了rowid最大之外的其他重复的数据了。1 }% `* e* \/ J0 X: y1 F
由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:8 t/ _& ^+ X8 `& v; N) S- p
delete from 表名 a
' n( u) a( F$ I7 a U+ B% W4 N where a.rowid !=1 L9 q j. }) j1 s+ C
(
' u7 q' l I4 Y& Z4 u1 B, z. h! X; w$ M select max(b.rowid) from 表名 b/ u4 @3 ^* n- D4 K% I
where a.字段1 = b.字段1 and3 A! c! F, ~# ~
a.字段2 = b.字段2
( c! U6 _1 [4 `% O1 l1 w )
2 G( y3 c9 X* G! E 随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。7 s$ g* H0 c8 g: l; }! C# T+ I: N
create table 临时表 as, `( R3 S. |. G" o% F- d" \% {" {
select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;5 c8 S- D! h/ V% D# {
delete from 表名 a& L% S' u6 Q, Y
where a.rowid !=( y2 `- h1 N& x& I+ J7 V% h" Q9 P
(
0 v0 p, L, r: N/ v9 Y select b.dataid from 临时表 b
' [. Z$ B6 ^8 r. D: K where a.字段1 = b.字段1 and
0 m4 O+ c0 [& L$ l# F, `. A a.字段2 = b.字段2
& C, `. x; ^. l );
5 t/ A' \* w3 X+ y commit; |