2
>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**  

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

4

2 回答 2

8

因为第二次,rownum不是内层SQL的rownum而是外层SQL的rownum!

这就是为什么您需要“重命名”它,使其变为“固定”的原因。

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

于 2010-08-27T06:30:38.250 回答
1
SELECT instmax   
FROM   
  (SELECT instmax,   
    rownum   
  FROM   
    (SELECT * FROM pswlinstmax ORDER BY instmax DESC   
    )   
  )   
WHERE rownum=2;   


**NO RETURNED ROW**   

提取的第一行被指定为 1 的 ROWNUM 并使条件为假。要获取的第二行现在是第一行,并且还分配了 1 的 ROWNUM 并使条件为假。随后所有行都不满足条件,因此不返回任何行。Oracle9i SQL 参考

在您的第一个示例中,内联视图中的查询返回所有行,每行都ROWNUM分配有一个递增的 name r

于 2010-08-27T16:34:00.640 回答