почему оба sql-запроса на rownum дают разные результаты - PullRequest
2 голосов
/ 27 августа 2010
>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 ]

8 голосов
/ 27 августа 2010

потому что второй раз, rownum - это не rownum внутреннего SQL, а rownum внешнего!

вот почему вам нужно «переименовать» его, чтобы он стал «исправленным».

в противном случае фильтр rownum = 2 никогда не совпадает, поскольку каждая строка является первой.

1 голос
/ 27 августа 2010
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.

...