273 votos

¿Cómo hacer el top 1 en el Oracle?

cómo hacer esto: select top 1 Fname from MyTbl

en el Oracle 11g?

gracias de antemano

0 votos

3 votos

¿Puede decirnos el orden según el cual quiere el "top 1"?

279voto

mcpeterson Puntos 1333

Si quieres sólo una primera fila seleccionada puedes:

select fname from MyTbl where rownum = 1

también puedes usar las funciones analíticas para ordenar y tomar la parte superior x

select max(fname) over (rank() order by some_factor) from MyTbl

60 votos

Esto es bueno si sólo quieres una fila y no te importa cuál. Si quieres filas específicas, como el registro más reciente, necesitas hacer la ordenación en una subselección, como la respuesta de Vash. Oracle asigna los rownums antes de la ordenación.

4 votos

@Scott yup. eso es correcto. Y Patrick, buen punto creo que la sintaxis es incorrecta en eso. Realmente debería ser un mantener (dense_rank() último... )

2 votos

La diferencia entre el primer y el segundo ejemplo es que el primero selecciona una fila (cualquier fila, sin orden). El segundo ejemplo obtiene el valor de la primera fila, sin hacer una consulta interna de orden (como en los ejemplos siguientes).

178voto

SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;

9 votos

Esta respuesta obtiene correctamente la fila TOP (ordena los resultados antes de restringir en ROWNUM).

0 votos

Esta respuesta no es una traducción exacta: la consulta original no tiene un ORDER BY, ni devuelve todas las columnas de la tabla.

0 votos

Me corrijo (ver más abajo). Cambiaré los votos cuando se acabe el tiempo.

11voto

a'r Puntos 14772
select * from (
    select FName from MyTbl
)
where rownumn <= 1;

6voto

OMG Ponies Puntos 144785

Usar:

SELECT x.*
  FROM (SELECT fname 
          FROM MyTbl) x
 WHERE ROWNUM = 1

Si se usa el Oracle9i+, se podría mirar usando funciones analíticas como ROW_NUMBER() pero no se desempeñarán tan bien como ROWNUM .

1 votos

Buena respuesta pero contiene una pequeña errata. Donde dices Oracle9i+ ¿no debería ser 8i? download-west.oracle.com/docs/cd/A87860_01/doc/server.817/

0 votos

@carpenteri: Cierto, las analíticas estaban disponibles en 8i - no recuerdo los detalles de, pero las analíticas no estuvieron realmente disponibles para el público hasta 9i.

0 votos

Pequeño comentario: la respuesta de Vash incluye un ORDER BY en la consulta interna, que es fundamental si quieres el valor TOP de fname, en lugar de 'first' (que puede ser cualquier cosa, probablemente la primera fila insertada). ¿Podría valer la pena una edición?

3voto

user2607028 Puntos 32

Tuve el mismo problema, y puedo arreglarlo con esta solución:

select a.*, rownum 
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = '1'

Puedes ordenar tu resultado antes para tener el primer valor arriba.

Buena cerradura

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X