Y a-t-il une alternative ANSI SQL au mot-clé MYSQL LIMIT?

y a-t-il une alternative ANSI SQL au mot-clé MYSQL LIMIT?

le mot-clé LIMIT Limite le nombre de lignes retournées par un SELECT E. g:

SELECT * FROM People WHERE Age > 18 LIMIT 2;

renvoie 2 lignes.

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

retourne 2 lignes après les 10 premières.

28
demandé sur Gary Willoughby 2009-02-27 18:04:26

7 réponses

cela montre les différentes façons:

-- 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
35
répondu jle 2014-12-10 21:29:40

Pas dans SQL:1999.

il y a deux approches possibles que vous pouvez utiliser dans les normes ultérieures, avec des niveaux généralement faibles de soutien dans le DBMSs d'aujourd'hui.

en SQL: 2008 vous pouvez utiliser la syntaxe DB/ 2:

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

cela ne fonctionne que pour la syntaxe" LIMIT n "et non pour la syntaxe étendue" LIMIT m, n". Dans SQL: 2003 vous pouvez utiliser des fonctions de fenêtre, qui peuvent supporter la syntaxe étendue mais est une super 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

vous utiliserez plus généralement les méthodes spécifiques au SGBD aujourd'hui.

20
répondu bobince 2009-02-27 15:19:04

voir aussi 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)
10
répondu groovehunter 2015-10-23 12:18:22

Je ne crois pas. Toutes les bases de données dont je suis au courant utilisent des mots-clés propres au fournisseur pour cette fonctionnalité.

3
répondu Jeremy DeGroot 2009-02-27 15:06:47

ajoute à @jle réponse :

  • SQLite supports LIMIT (MySQL/PostgreSQL)
  • InterBase / Firebird support SELECT FIRST et SKIP (comme Informix)

Also see Emulate MySQL LIMIT clause in Microsoft SQL Server 2000

1
répondu Bill Karwin 2017-05-23 12:26:13

HSQL / H2 utilise limite comme MySQL

1
répondu Manik Surtani 2010-03-10 13:01:29