Consulta SQL en Rownum
Pregunta
SELECT instmax
FROM
(SELECT instmax ,rownum r
FROM
( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
WHERE r = 2
);
Después de la ejecución está dando este error:
ORA-00904: "R": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 39 Column: 8
¿Por qué está dando este error?
Solución
Porque los alias no son compatibles con la cláusula WHERE de la misma consulta. Entonces, en su lugar, escriba su consulta como:
SELECT instmax
FROM
(SELECT instmax ,rownum r
FROM
( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
) WHERE r = 2;
Otros consejos
En primer lugar, no puede hacer referencia a una segunda fila usando un rownum = 2
condición. Puede seleccionar las primeras dos filas especificando un where rownum < 3
condición, o puede envolverlo en otra consulta y hacer referencia a su rownum
como una columna ordinaria desde allí.
Entonces, no puede hacer referencia a un alias de columna en un where
Cláusula de una subconsulta se asignó este alias. Puedes traerlo un nivel:
SELECT instmax
FROM (SELECT instmax, rownum r
FROM (SELECT instmax
FROM pswlinstmax
ORDER BY instmax DESC NULLS LAST)
)
WHERE r = 2;
O simplemente evite esta referencia
-- 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
);
No puede hacer referencia a un alias de columna en la cláusula Where como esa.
El Rownum tampoco dejará de trabajar de esa manera. Prueba algo como esto:
select instmax from
(
SELECT instmax, row_number(instmax) order by (instmax desc nulls last) rownumber
FROM pswlinstmax
)
where rownumber = 2;
@Amit tiene razón. Porque Oracle primero evalúa la condición Where, luego seleccione. Tienes que hacer sub-selección.
en vez de:
SELECT instmax
FROM(
SELECT instmax ,rownum r
FROM (SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST)
WHERE r = 2
);
Haz lo siguiente:
SELECT instmax
FROM ( SELECT instmax ,rownum r
FROM ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST )
)
WHERE r = 2
;
... R ahora es visible para la cláusula Where. Propablemente, esta pregunta es idéntica/similar/duplicada para esto:
Una forma común de obtener, digamos los cinco principales empleados altamente pagados.
SELECT ename,sal FROM emp
WHERE rownum <= 5
ORDER BY sal DESC;