ORACLE 中重复值问题

来源:百度知道 编辑:UC知道 时间:2024/06/07 18:55:03
SELECT ROWID,EMPNO,JOB FROM EMP
WHERE ROWID!=(SELECT MAX(ROWID) FROM EMP D
WHERE EMP.JOB=D.JOB)
ORDER BY JOB;
此语句的功能是查询重复记录,请哪位高手帮我分析一下到底是怎样查询的啊,其中的ROWID!=(.. 是怎么回事啊,我对其中的where子句没有搞懂,请分析详细一点啊,或者是有关于此知识点的网址啊,谢谢啊

举例解释:
现在EMP表有三条记录,分别为a(rowid=1),b(rowid=2),b(rowid=3)。(b存在重复)
那么where语句中,
对于记录a来说,只有一条记录,其rowid为1,而关联的D的max(rowid)也为1,由于1=1,所以条件不成立,记录a不会被检出;
对于记录b来说,由于存在2条记录,rowid分别为2和3,而关联的D的max(rowid)也为3(2小于3),所以rowid为2的记录满足条件(2<>3),rowid为2的b记录会被检出,rowid为3的记录不会被检出。
故对于以上,查询结果就是b(rowid=2)。

总结:此语句对于任何存在件数为n(n>=1)的记录来说,必将有n-1条记录被检出。

呵呵,其实这个也很简单,拆分一下就明白了,当然这是查询ROWID重复记录的
先说一下里边sql:SELECT MAX(ROWID) FROM EMP D WHERE EMP.JOB=D.JOB
的意思,就是对于外面的select中的每一行与里面sql中的重复记录,然后从重复记录中查出最大的ROWID,外面的sql就是查询出与这个最大的ROWID重复的记录。
总结一下:该sql的意思就是查询出与最大的ROWID重复的记录。

首先你的程序肯定是有错误的,自己好好检查下
你的这个SQL语句实际上就用了一个在where子句下的嵌套而已。
你记住,所有嵌套关系都是先执行最里面一层的语句,然后逐层向外面执行。

对于你这条语句首先找出rowid最大的值,我觉得你内层里where子句是多余的,因为你所要的条件是一个表的job和它自己比较,用不上啊,肯定相等的。
然后再看外层,找出rowid,empno,job,要求是rowid不等于最大的一个。
最后对查询出来的数据按job排序,不过这里我也想问了,你怎么用job排序啊,是用jobid排序吧。

最后对于你提出的rowid其实它是你表里的伪列,一般情况不会去查询它的,但是对排序可以用到它,索引也能用到,是一个很有用的列

在一个表中查询重复记录不需要这么高深