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?

¿Fue útil?

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:

Usar un alias en una cláusula Where

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top