2009-02-27 16 views
26

¿Existe una alternativa ANSI SQL a la palabra clave MYSQL LIMIT?¿Existe una alternativa ANSI SQL a la palabra clave MYSQL LIMIT?

La palabra clave LIMIT limita el número de filas devueltas por una por ejemplo SELECT:

SELECT * FROM People WHERE Age > 18 LIMIT 2; 

devuelve 2 filas.

SELECT * FROM People WHERE Age > 18 LIMIT 10, 2; 

retornos 2 filas después de la primera

10.
+0

Um ... Aquellos de nosotros que conocemos ANSI SQL puede ser capaz de ayudarle si usted nos dijo lo que hizo la palabra clave LIMIT MySql ... –

+0

James, SELECT * FROM tabla LIMIT x devuelve el primer x resultados, y SELECCIONAR * FROM tabla LIMIT x, y devuelve y resultados con un desplazamiento de x. – Aistina

+0

@Aistina: Huh. No sabía la versión LIMIT X, Y, ¡muy útil! – Ben

Respuesta

31

this shows the different ways:

-- DB2 
select * from table fetch first 10 rows only 
-- Informix 
select first 10 * from table 
-- Microsoft SQL Server and Access 
select top 10 * from table 
-- MySQL and PostgreSQL 
select * from table limit 10 
-- Oracle 
select * from (select * from table) where rownum <= 10 
+7

Siempre he pensado era ridículo que Oracle le haga hacer una subselección para hacerlo de esta manera, pero la propiedad rownum se asigna antes de reordenar con ORDER BY. – Powerlord

+0

'oráculo' tiene sus pros y sus contras ¿eh? Me gusta la combinación de Oracle taquigrafía (+) para una combinación externa ... – jle

+2

+1 buen resumen! SQLite admite LIMIT, como MySQL/PostgreSQL. InterBase/Firebird son compatibles con SELECT FIRST y SKIP, como Informix. –

3

que no creen así. Todas las bases de datos de las que tengo conocimiento utilizan palabras clave específicas del proveedor para esa funcionalidad.

20
No

en SQL: 1999.

Existen dos enfoques posibles que puede usar en estándares posteriores, con niveles generalmente bajos de soporte en los DBMS actuales.

En SQL: 2008 se puede usar la sintaxis de DB/2:

SELECT * FROM things 
ORDER BY smell 
FETCH FIRST n ROWS ONLY 

Esto sólo funciona para “LÍMITE n” y no el extendido “LÍMITE m, n” compensado sintaxis. En SQL: 2003 se puede utilizar funciones de la ventana, que pueden apoyar la sintaxis extendida, pero es una súper PITA:

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY smell) AS rn, 
    FROM things 
) 
WHERE rn<=n -- or rn BETWEEN m+1 AND m+n 

usted más generalmente utilizar los métodos específicos de DBMS hoy.

1

HSQL/H2 utiliza LIMIT como MySQL

6

ver también http://en.wikipedia.org/wiki/Select_(SQL)#FETCH_FIRST_clause

SELECT * FROM T LIMIT 10 OFFSET 20 -- Netezza, MySQL, PostgreSQL (also supports the standard, since version 8.4), SQLite, HSQLDB, H2 

SELECT * from T WHERE ROWNUM <= 10 -- Oracle (also supports the standard, since Oracle8i) 

SELECT FIRST 10 * from T -- Ingres 

SELECT FIRST 10 * FROM T order by a -- Informix 

SELECT SKIP 20 FIRST 10 * FROM T order by c, d -- Informix (row numbers are filtered after order by is evaluated. SKIP clause was introduced in a v10.00.xC4 fixpack) 

SELECT TOP 10 * FROM T -- MS SQL Server, Sybase ASE, MS Access 

SELECT TOP 10 START AT 20 * FROM T -- Sybase SQL Anywhere (also supports the standard, since version 9.0.1) 

SELECT FIRST 10 SKIP 20 * FROM T -- Interbase, Firebird 

SELECT * FROM T ROWS 20 TO 30 -- Firebird (since version 2.1) 

SELECT * FROM T 
WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY -- DB2 

SELECT * FROM T 
WHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY -- DB2 (new rows are filtered after comparing with key column of table T) 
0
Cuestiones relacionadas