当前位置: 代码迷 >> Oracle开发 >> Oracle去重不理解的地方求指教解决思路
  详细解决方案

Oracle去重不理解的地方求指教解决思路

热度:72   发布时间:2016-04-24 06:36:54.0
Oracle去重不理解的地方求指教
select b.rowid,b.* from bonus b where b.rowid =(select max(rowid) from bonus a where a.ename=b.ename);
这个地方没有进行分组 按道理讲应该查询的是最大的那一个rowid 
但是实际上他按照name分组了 查询了 多个重复的结果

------解决方案--------------------
引用:
select b.rowid,b.* from bonus b where b.rowid =(select max(rowid) from bonus a where a.ename=b.ename);
这个地方没有进行分组 按道理讲应该查询的是最大的那一个rowid 
但是实际上他按照name分组了 查询了 多个重复的结果

where a.ename=b.ename这个条件导致了按照name分组。
每次都会和外层b表的ename进行连接,其实就相当于求出了每个ename中最大的rowid
------解决方案--------------------
select *
  from (select ROW_NUMBER() OVER(ORDER BYb.rowid DESC) RANK_NUM,
               b.rowid,
               b.*  from bonus b where b.rowid)
 where rank_num = 1
这样写应该就是你要的效果了
------解决方案--------------------
引用:
相当于是什么概念?

我试着给你逐一解答下

select b.rowid,b.* from bonus b where b.rowid =(select max(rowid) from bonus a where a.ename=b.ename);

--1、select max(rowid) from bonus a where a.ename=b.ename
  -- 这句是根据b.ename求到这个ename的最大的物理存储地址,即根据ename找到重复值中的最大的一个地址值。
--2、select b.rowid,b.* from bonus b where b.rowid =(select max(rowid) from bonus a where a.ename=b.ename);
  --所以外层sql意思是根据嵌套sql里面的物理地址查询,直接查询的是bonus表中根据name分组后的最大值,即去重其他值。
  相关解决方案