SQL запрос на rownum - PullRequest
       7

SQL запрос на rownum

0 голосов
/ 27 августа 2010
SELECT instmax
FROM
  (SELECT instmax ,rownum r
  FROM
    ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
    )
  WHERE r = 2
  );

После выполнения выдает эту ошибку:

ORA-00904: "R": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 39 Column: 8

почему выдает эту ошибку ??

Ответы [ 5 ]

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

Поскольку псевдонимы не поддерживаются в предложении WHERE того же запроса.Поэтому вместо этого напишите ваш запрос как:

SELECT instmax
FROM 
  (SELECT instmax ,rownum r 
  FROM 
    ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST 
    )  
) WHERE r = 2;
2 голосов
/ 27 августа 2010

Прежде всего, вы не можете ссылаться на вторую строку, используя условие rownum = 2. Вы можете выбрать первые две строки, указав условие where rownum < 3, или вы можете заключить его в другой запрос и ссылаться на ваш rownum как обычный столбец.

Тогда вы не можете ссылаться на псевдоним столбца в предложении where подзапроса, которому был назначен этот псевдоним. Вы можете поднять его на один уровень вверх:

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

или просто избегайте этой ссылки

-- this will return first two rows
SELECT instmax
  FROM (SELECT instmax, rownum r
          FROM (SELECT instmax
                  FROM pswlinstmax
                 ORDER BY instmax DESC NULLS LAST)

         WHERE rownum < 3
         );
1 голос
/ 27 августа 2010

Вы не можете ссылаться на псевдоним столбца в таком выражении where.

В этом случае rownum также не будет работать.Попробуйте что-то вроде этого:

select instmax from
(
  SELECT instmax, row_number(instmax) order by (instmax desc nulls last) rownumber
  FROM pswlinstmax
)
where rownumber = 2;
0 голосов
/ 30 ноября 2012

Обычный способ получить, скажем, пять лучших высокооплачиваемых сотрудников.

SELECT ename,sal FROM   emp
WHERE  rownum <= 5
ORDER BY sal DESC;
0 голосов
/ 27 августа 2010

@ Амит прав. Поскольку Oracle сначала оценивает условие WHERE, затем SELECT. Вы должны сделать суб-выбор.

вместо:

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

сделать следующее:

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

... r теперь отображается в предложении WHERE. Вероятно, этот вопрос идентичен / похож / дубликат для этого:

Использование псевдонима в предложении WHERE

...