SQL-запрос на роуземе
Вопрос
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;