2009-02-27 4 views
26

Existe-t-il une alternative SQL ANSI au mot clé MYSQL LIMIT?Existe-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 par exemple:

SELECT * FROM People WHERE Age > 18 LIMIT 2; 

rendements 2 rangs.

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

renvoie 2 lignes après la première 10.

+0

Um ... Ceux d'entre nous qui savent Ansi SQL peut être en mesure de vous aider si vous nous avez dit ce que le mot-clé LIMIT MySql a fait ... –

+0

James, SELECT * FROM table LIMIT x renvoie le premier x résultats, et SELECT * FROM table LIMIT x, y renvoie y résultats avec un décalage de x. – Aistina

+0

@Aistina: Huh. Je ne connaissais pas la version LIMIT x, y - très pratique! – Ben

Répondre

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

J'ai toujours pensé Il était ridicule qu'Oracle vous oblige à faire une sous-sélection de cette façon, mais la propriété rownum est assignée avant de réorganiser avec ORDER BY. – Powerlord

+0

'oraclese' a ses avantages et ses inconvénients? J'aime bien le raccourci d'Oracle (+) pour une jointure externe ... – jle

+2

+1 joli résumé! SQLite supporte LIMIT, comme MySQL/PostgreSQL. InterBase/Firebird prend en charge SELECT FIRST et SKIP, comme Informix. –

3

Je ne crois pas. Toutes les bases de données que je connais utilisent des mots-clés spécifiques au fournisseur pour cette fonctionnalité.

20

pas dans SQL: 1999.

Il existe deux approches possibles que vous pouvez utiliser dans les normes ultérieures, avec des niveaux de support généralement faibles dans les SGBD actuels.

Dans 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 « LIMIT n » et non l'étendue « LIMIT m, n » syntaxe décalage. Dans SQL: 2003, vous pouvez utiliser les fonctions de fenêtre, qui peuvent prendre en charge la syntaxe étendue mais est 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 aux SGBD aujourd'hui.

1

HSQL/H2 utilise LIMIT comme MySQL

6

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) 
0