Kategorien:

Abfragesyntax

LIMIT / FETCH

Begrenzt die maximale Anzahl von Zeilen, die von einer Anweisung oder Unterabfrage zurückgegeben werden. Sowohl LIMIT (PostgreSQL-Syntax) als auch FETCH (ANSI-Syntax) werden unterstützt und liefern das gleiche Ergebnis.

Siehe auch:

TOP <n>

Syntax

PostgreSQL-Syntax

SELECT ...
FROM ...
[ ORDER BY ... ]
LIMIT <count> [ OFFSET <start> ]
[ ... ]

ANSI-Syntax

SELECT ...
FROM ...
[ ORDER BY ... ]
[ OFFSET <start> ] [ { ROW | ROWS } ] FETCH [ { FIRST | NEXT } ] <count> [ { ROW | ROWS } ] [ ONLY ]
[ ... ]

Parameter

count

Die Anzahl der zurückgegebenen Zeilen. Muss eine nicht-negative Ganzzahl-Konstante sein.

Die Werte NULL, leere Zeichenfolge ('') und $$$$ werden ebenfalls akzeptiert und als „unbegrenzt“ behandelt. Dies ist vor allem für Konnektoren und Treiber (wie den JDBC-Treiber) hilfreich, wenn diese beim dynamischen Binden von Parametern an eine Anweisung eine unvollständige Parameterliste erhalten.

OFFSET start

Die Zeilennummer, nach der die beschränkten/abgerufenen Zeilen zurückgegeben werden. Muss eine nicht-negative Ganzzahl-Konstante sein.

Wenn OFFSET weggelassen wird, beginnt die Ausgabe mit der ersten Zeile des Resultsets.

Die Werte NULL, leere Zeichenfolge ('') und $$$$ werden ebenfalls akzeptiert und als 0 behandelt (d. h. es werden keine Zeilen übersprungen). Dies ist vor allem für Konnektoren und Treiber (wie den JDBC-Treiber) hilfreich, wenn diese beim dynamischen Binden von Parametern an eine Anweisung eine unvollständige Parameterliste erhalten.

ONLY

Optionales Schlüsselwort, das keinen Einfluss auf die Ausgabe hat Es wird zur Betonung für den menschlichen Leser verwendet.

Nutzungshinweise

  • Eine ORDER BY-Klausel ist nicht erforderlich. Ohne eine ORDERBY-Klausel sind die Ergebnisse jedoch nicht deterministisch, da die Abfrageergebnisse nicht notwendigerweise eine bestimmten Reihenfolge aufweisen. Verwenden Sie eine ORDERBY-Klausel, um die zurückgegebenen Ergebnisse zu kontrollieren.

  • Eine ORDER BY-Klausel in einer Unterabfrage garantiert nur die Reihenfolge innerhalb dieser Unterabfrage. Die Reihenfolge wird in den äußeren Abfrageebenen nicht beibehalten. Wenn eine LIMIT-Klausel von einer ORDER BY-Klausel aus einer anderen Verschachtelungsebene abhängt, wendet das Optimierungsprogramm möglicherweise die LIMIT-Klausel nicht wie erwartet an, und die Anzahl der zurückgegebenen Zeilen kann vom LIMIT-Wert abweichen. Eine COUNT(*)-Abfrage in derselben Unterabfrage kann auch eine andere Anzahl von Zeilen zurückgeben als die tatsächlich zurückgegebene Anzahl von Zeilen.

    In der folgenden Abfrage sortiert beispielsweise die innerste Unterabfrage die Ergebnisse, die mittlere Unterabfrage begrenzt die Ausgabe auf sechs Zeilen, und die äußere Abfrage begrenzt die Ausgabe auf 100 Zeilen. Sie könnten sechs Zeilen erwarten, da die innere LIMIT-Klausel kleiner ist, aber da sich die ORDER BY-Klausel in einer anderen Unterabfrage der LIMIT-Klausel befindet, sind die Ergebnisse unvorhersehbar, und die Abfrage könnte mehr oder weniger als sechs Zeilen zurückgeben:

    SELECT *
      FROM (
            SELECT *
              FROM (
                     SELECT *
                       FROM my_table
                       ORDER BY col1  -- Ordering: innermost level
                   )
              LIMIT 6                 -- LIMIT: middle level
           )
      LIMIT 100;                      -- LIMIT: outermost level
    

    Um unvorhersehbare Ergebnisse zu vermeiden, behalten Sie die ORDER BY-Klausel und die LIMIT (oder FETCH)-Klausel auf der gleichen Abfrageebene bei:

    SELECT *
      FROM my_table
      ORDER BY col1
      LIMIT 6;
    
  • Top-K Pruning kann die Leistung von Abfragen verbessern, die sowohl LIMIT- als auch ORDER BY-Klauseln enthalten. Weitere Informationen dazu finden Sie unter Top-K Pruning für verbesserte Abfrageleistung.

  • TOP n und LIMIT count sind gleichwertig.

  • Sowohl die LIMIT-Klausel als auch die SAMPLE-Klausel geben eine Teilmenge von Zeilen aus einer Tabelle zurück. Wenn Sie die LIMIT-Klausel verwenden, gibt Snowflake die angegebene Anzahl von Zeilen auf schnellstmögliche Weise zurück. Wenn Sie die SAMPLE-Klausel verwenden, gibt Snowflake Zeilen auf der Grundlage der in der Klausel angegebenen Samplingmethode zurück.

Beispiele

Die folgenden Beispiele zeigen die Auswirkung von LIMIT. Der Einfachheit halber wird in diesen Abfragen die ORDER BY-Klausel weggelassen und angenommen, dass die Ausgabereihenfolge immer wie in der ersten Abfrage ist. Reale Abfragen sollten ORDER BY enthalten.

SELECT c1 FROM testtable;
+------+
|   C1 |
|------|
|    1 |
|    2 |
|    3 |
|   20 |
|   19 |
|   18 |
|    1 |
|    2 |
|    3 |
|    4 |
| NULL |
|   30 |
| NULL |
+------+
SELECT c1 FROM testtable LIMIT 3 OFFSET 3;
+----+
| C1 |
|----|
| 20 |
| 19 |
| 18 |
+----+
SELECT c1 FROM testtable ORDER BY c1;
+------+
|   C1 |
|------|
|    1 |
|    1 |
|    2 |
|    2 |
|    3 |
|    3 |
|    4 |
|   18 |
|   19 |
|   20 |
|   30 |
| NULL |
| NULL |
+------+
SELECT c1 FROM testtable ORDER BY c1 LIMIT 3 OFFSET 3;
+----+
| ID |
|----|
|  2 |
|  3 |
|  3 |
+----+

Die folgenden Beispiele zeigen die Verwendung von NULLs-Werten, um Folgendes anzugeben:

  • Keine Begrenzung der Zeilenanzahl.

  • Beginnen Sie bei Zeile eins (keine Zeilen überspringen).

    CREATE TABLE demo1 (i INTEGER);
    INSERT INTO demo1 (i) VALUES (1), (2);
    
    SELECT * FROM demo1 ORDER BY i LIMIT NULL OFFSET NULL;
    
    +---+
    | I |
    |---|
    | 1 |
    | 2 |
    +---+
    
    SELECT * FROM demo1 ORDER BY i LIMIT '' OFFSET '';
    
    +---+
    | I |
    |---|
    | 1 |
    | 2 |
    +---+
    
    SELECT * FROM demo1 ORDER BY i LIMIT $$$$ OFFSET $$$$;
    
    +---+
    | I |
    |---|
    | 1 |
    | 2 |
    +---+