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

2 回目なので、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 が割り当てられ、条件が false になります。フェッチされる 2 番目の行が最初の行になり、1 の ROWNUM が割り当てられ、条件が false になります。その後、すべての行が条件を満たさないため、行は返されません。Oracle9i SQL リファレンス

最初の例では、インライン ビューのクエリはすべての行を返し、それぞれにROWNUM名前が割り当てられますr

于 2010-08-27T16:34:00.640 に答える