2009-02-27 7 views
26

Gibt es eine ANSI SQL-Alternative zum Schlüsselwort MYSQL LIMIT?Gibt es eine ANSI SQL-Alternative zum Schlüsselwort MYSQL LIMIT?

Das Schlüsselwort LIMIT begrenzt die Anzahl der Zeilen, die von einer SELECT z.B zurückgegeben:

SELECT * FROM People WHERE Age > 18 LIMIT 2; 

kehrt 2 Reihen.

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

kehrt 2 Zeilen nach dem ersten 10.

+0

Um ... Diejenigen von uns, die Ansi SQL wissen können, kann Ihnen helfen, wenn Sie uns gesagt, was die MySql LIMIT Stichwort tat ... –

+0

James, SELECT * FROM Tabelle LIMIT x gibt die erste x Ergebnisse und SELECT * FROM Tabelle LIMIT x, y gibt y Ergebnisse mit einem Offset von x zurück. – Aistina

+0

@Aistina: Huh. Ich kannte die LIMIT x, y Version nicht - sehr praktisch! – Ben

Antwort

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

Ich habe immer gedacht Es war lächerlich, dass Oracle dazu veranlasst, einen Subselect zu machen, um dies auf diese Weise zu tun, aber die rownum-Eigenschaft wird vor der Neuanordnung mit ORDER BY zugewiesen. – Powerlord

+0

"Orakel" hat seine Vor- und Nachteile? Ich mag Oracle Join Shorthand (+) für eine äußere Verbindung ... – jle

+2

+1 schöne Zusammenfassung! SQLite unterstützt LIMIT, wie MySQL/PostgreSQL. InterBase/Firebird unterstützt SELECT FIRST und SKIP wie Informix. –

3

Ich glaube also nicht. Alle mir bekannten Datenbanken verwenden für diese Funktionalität herstellerspezifische Schlüsselwörter.

20

Nicht in SQL: 1999.

Es gibt zwei mögliche Ansätze, die Sie in späteren Standards verwenden können, mit einer im Allgemeinen niedrigen Unterstützungsebene in heutigen DBMSs.

In SQL: 2008 können Sie die DB/2 Syntax:

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

Dies funktioniert nur für „LIMIT n“ und nicht der erweiterten „LIMIT m, n“ Syntax versetzt. In SQL: 2003 können Sie Fensterfunktionen verwenden, die die erweiterte Syntax unterstützen kann, ist aber ein 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 

Sie werden mehr in der Regel heute die DBMS-spezifischen Methoden.

1

HSQL/H2 verwendet LIMIT wie MySQL

6

siehe auch 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