2009-05-06 20 views
14

En SQL Server, TOP se puede usar para devolver el primer n número de filas en una consulta. Por ejemplo, Equivalentes a SQL Server TOP

SELECT TOP 100 * FROM users ORDER BY id
podría usarse para devolver las primeras 100 personas que se registraron para un sitio. (Esta no es necesariamente la mejor manera, solo la estoy usando como un ejemplo).

Mi pregunta es: ¿Cuál es el equivalente a TOP en otras bases de datos, como Oracle, MySQL, PostgreSQL, etc.? Si no hay una palabra clave equivalente, ¿qué soluciones alternativas puede recomendar para lograr el mismo resultado?

+0

Duplicado: http://stackoverflow.com/questions/595123/is-there-an-ansi-sql-alternative-to-the-mysql-limit-keyword –

+0

Técnicamente, sí. Pero solo si conoce la palabra clave mysql LIMIT que no tenía en ese momento. –

Respuesta

20

Para seleccionar primeras filas 100:

MySQL y PostgreSQL:

SELECT * 
FROM Table 
ORDER BY 
     column 
LIMIT 100 

Oracle:

SELECT * 
FROM (
     SELECT t.* 
     FROM table 
     ORDER BY 
       column 
     ) 
WHERE rownum <= 100 

en cuenta que necesita una sub consulta aquí. Si no agrega una subconsulta, ROWNUM seleccionará las primeras filas 10 en orden aleatorio y luego las ordenará por column.

Para seleccionar filas entre 100 y 300:

MySQL:

SELECT * 
FROM TABLE 
ORDER BY 
     column 
LIMIT 100, 200 

PostgreSQL:

SELECT * 
FROM Table 
ORDER BY 
     column 
OFFSET 100 LIMIT 200 

Oracle:

SELECT * 
FROM (
     SELECT t.*, ROW_NUMBER() OVER (ORER BY column) AS rn 
     FROM table 
     ) 
WHERE rn >= 100 
     AND rownum <= 200 

Tenga en cuenta que un intento de simplificarlo con ROWNUM BETWEEN 100 AND 200 (en oposición a rn BETWEEN 100 AND 200 en la consulta externa) no devolverá nada en Oracle!

RN BETWEEN 100 AND 200 funcionará también en Oracle pero es menos eficiente.

Ver el artículo en mi blog para los detalles de rendimiento:

+0

¿por qué no está estandarizado? Lo que @ocdecia publicó no está nada claro, creo que las notaciones de mysql y postgre son las mejores – Pablote

+0

@Pablote: porque Oracle es más viejo que yo, y Sybase (en el que se basa SQL Server) solo tiene 4 años menos. No hubo estándares esa vez. Y para cuando aparecieron los estándares, ya existía demasiado código para cambiar cualquier cosa. – Quassnoi

+0

@Pablote: lo que @ocdecio ha publicado son funciones anayltic, no limita el conjunto de registros. Se pueden usar para limitar los conjuntos de registros, pero no es su objetivo principal. – Quassnoi

1
LIMIT 100 

como en

SELECT * FROM foo ORDER BY bar LIMIT 100 
6

Para PostgreSQL y MySQL es la palabra clave LIMIT.

SELECT * 
    FROM users 
ORDER BY id 
LIMIT 100; 
1

Puede usar RANK() y DENSE_RANK() en Oracle. Here es un enlace al sitio web AskTom en el que se explica cómo realizar la paginación y las consultas top-n con DENSE_RANK en Oracle.

1

Oracle:

select * from (select * from foo ORDER BY bar) where rownum < 100 

Con una buena explicación sobre cómo hacer que funcione en AskTom.

En Ingres la misma consulta haría por:

select First 100 * from foo ORDER BY bar 

pregunta Ingres ya fue respondida en StackOverflow antes.

+0

Por lo tanto, la consulta debe en realidad a través de: SELECT * FROM (SELECT * FROM foo fin por la barra), donde rownum <100 para conseguir el top 100 después de que el pedido ... – Sean

+0

Vaya, eso debería ser <= 100 como rownum comienza en 1 – Sean

3

Este es el estándar SQL (Oracle y SQL Server implementan). Este es un ejemplo de cómo devolver hasta 100 filas:

 SELECT ID_CONTROL FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID_CONTROL) 
     ROWNUMBER, ID_CONTROL FROM IWS_CONTROL WHERE 
     CURRENT_STATE = 15 AND CURRENT_STATUS=0) A WHERE ROWNUMBER <= 100) 
+0

eso es genial. no sabía que podrías hacer esto. – Zack

0

En Oracle, desea utilizar una consulta TOP-N.

Por ejemplo:

select * 
    from (SELECT * 
      FROM foo 
      where foo_id=[number] 
     order by foo_id desc) 
where rownum <= 3 

Esto obtendrá los tres mejores resultados (porque ordeno por la descripción de la consulta sub)

1

En DB2 que haría su mirada consulta como esta:

SELECCIONAR * FROM tblData PONER LAS PRIMERAS 10 FILAS SOLAMENTE;

2

En SQL Anywhere, que es lo mismo que SQL Server:

SELECT TOP 100 * FROM users ORDER BY id 

incluso se puede iniciar en el medio del conjunto de resultados si quieren:

SELECT TOP 100 START AT 50 * FROM users ORDER BY id 

obtiene el 50 por las filas del 150 del conjunto de resultados.