每一行数据都有一个伪列rowid,
SELECT * FROM aaa
WHERE ROWID!=(SELECT MAX(ROWID) FROM aaa D
WHERE aaa.name=D.name AND aaa.sal=D.sal) 是数据值相同,但是伪列的值不同,当然是重复的记录了.
SELECT * FROM aaa
WHERE ROWID!=(SELECT MAX(ROWID) FROM aaa D
WHERE aaa.name=D.name AND aaa.sal=D.sal) 是数据值相同,但是伪列的值不同,当然是重复的记录了.
select * from your_table
where rowid!=( select max(rowid) from your_table yyyy
where yout_table.c1=yyyy.c1)删除重复记录
delete from your_table
where rowid!=( select max(rowid) from your_table yyyy
where yout_table.c1=yyyy.c1)
SELECT MAX(ROWID) FROM aaa D
WHERE aaa.name=D.name AND aaa.sal=D.sal 这句是选出重复记录里rowid最大的那个?
SELECT * FROM aaa WHERE ROWID!=最大的rowid,结果不应该是有3条记录的rowid都不等于最大的那个么?
这句是选出重复记录里rowid最大的
2.SELECT * FROM aaa 是查出所有的
name sal 假设rowid
zp 1 1
zp 1 2
zp 1 3
SELECT * FROM aaa
WHERE ROWID!=(SELECT MAX(ROWID) FROM aaa D
WHERE aaa.name=D.name AND aaa.sal=D.sal)
相当
SELECT * FROM aaa WHERE ROWID!=3 当然有两条记录了,这辆条就是重复的记录(不包括最大的
3.
SELECT * FROM aaa
WHERE ROWID<=(SELECT MAX(ROWID) FROM aaa D
WHERE aaa.name=D.name AND aaa.sal=D.sal) 这样可以查出三条记录,包括最大的rowid那条4.主要的原因在于!=
name sal 假设rowid
zp 1 1
zp 1 2
zp 1 3
zpp 2 4
按你所说,max(rowid)=3 ,select * from aa where rowid!=3 就有3条记录阿!
表aaa
name sal
zp 1
zpp 2
zp 1
zp 1
SELECT * FROM aaa
WHERE ROWID!=(SELECT MAX(ROWID) FROM aaa D
WHERE aaa.name=D.name AND aaa.sal=D.sal);
看一下oracle是如何处理的:
假设第一条的orwid最大
首先取到第一条zp 1,
执行SELECT MAX(ROWID) FROM aaa D
WHERE D.name='zp' AND D.sal=1
结果不符合条件,不输出
第二条
执行SELECT MAX(ROWID) FROM aaa D
WHERE D.name='zpp' AND D.sal=2
结果不符合条件,不输出
后面两条都符合条件,输出。
所以执行结果是:
name sal
zp 1
zp 1