Вопрос

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

Почему это дает эту ошибку ??

Это было полезно?

Решение

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

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

Другие советы

Прежде всего, вы не можете ссылаться на второй ряд, используя 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
         );

Вы не можете ссылаться на псевдоним столбца в пункте «Где».

Роуплем тоже не уводит работу. Попробуйте что-то вроде этого:

select instmax from
(
  SELECT instmax, row_number(instmax) order by (instmax desc nulls last) rownumber
  FROM pswlinstmax
)
where rownumber = 2;

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

вместо:

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 теперь видны как предложение, где. Осведомо, этот вопрос выявлен / подобный / дубликат для этого:

Использование псевдонима в той положении

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

SELECT ename,sal FROM   emp
WHERE  rownum <= 5
ORDER BY sal DESC;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top