为什么rownum上的sql查询都给出了不同的结果

时间:2010-08-27 06:23:58

标签: sql oracle plsql max rownum

>SELECT instmax  
FROM  
  (SELECT instmax,  
     rownum r  
  FROM  
    ( SELECT * FROM pswlinstmax ORDER BY instmax DESC NULLS LAST  
    )   
  )  
WHERE r = 2;  

INSTMAX  
-------  
1049  

>SELECT instmax  
FROM  
  (SELECT instmax,  
    rownum  
  FROM  
    (SELECT * FROM pswlinstmax ORDER BY instmax DESC  
    )  
  )  
WHERE rownum=2;  


**NO RETURNED ROW**  

为什么会给出不同的结果?我想对此进行详细解释。

2 个答案:

答案 0 :(得分:8)

因为secont时间,rownum不是内部SQL的rownum而是外部的rownum!

这就是你需要“重命名”它的原因,以便它变得“固定”。

否则,rownum = 2过滤器永远不匹配,因为每一行都是第一行。

答案 1 :(得分:1)

SELECT instmax   
FROM   
  (SELECT instmax,   
    rownum   
  FROM   
    (SELECT * FROM pswlinstmax ORDER BY instmax DESC   
    )   
  )   
WHERE rownum=2;   


**NO RETURNED ROW**   
  

为获取的第一行分配了一个   ROWNUM为1并且成为条件   假。要获取的第二行是   现在第一行也被分配了   ROWNUM为1并且成为条件   假。所有行随后都失败了   满足条件,所以没有行   回。 Oracle9i SQL Reference

在第一个示例中,内联视图中的查询会返回所有行,每个行的增量ROWNUM都指定了名称r