Die Ausgabe limitieren

ANSI SQL bietet die Möglichkeit, die Ausgabe von Datensätzen mit einfachen Mitteln zu limitieren. Die Schlüsselwörter LIMIT und OFFSET beschränken die Ausgabe so, dass ein SELECT Statement nicht erst eine ganze Tabelle lesen muss, um das Ergebnis zu erzeugen.

Wollen wir beispielsweise nur kurz in eine Tabelle hineinschauen, um zu sehen, welche Werte prinzipiell vorkommen, kann man wie folgt vorgehen:

test=# SELECT * FROM t_person LIMIT 2;
   svnr   |     name
----------+---------------
 123456   | Markus Eisner
 12345678 | Leo Lechner
(2 rows)

PostgreSQL durchläuft die Tabelle sequentiell und gibt die ersten beiden Datensätze aus. Obwohl LIMIT vom SQL Standard vorgeschrieben wird, wird es von Oracle nicht unterstützt. Das kann mitunter sehr mühsam sein, da statt LIMIT die Funktion ROW_NUMBER() verwendet werden muss, um den Output zu limitieren.

Neben LIMIT gibt es noch die Möglichkeit, OFFSET zu verwenden. Während LIMIT die Ausgabe auf eine bestimmte Anzahl beschränkt, dient OFFSET zum Weglassen von Datensätzen. Wollen wir beispielsweise den zweiten und dritten Datensatz aus einer Tabelle extrahieren, können wir das folgende SQL verwenden:

test=# SELECT * FROM t_person LIMIT 2 OFFSET 1;
   svnr   |    name
----------+-------------
 12345678 | Leo Lechner
 2345     | Gaika Huber
(2 rows)

Wenn Sie bei Ihren Tests andere Ergebnisse bekommen, sollte Sie das nicht weiter wundern. Der SQL Standard schreibt NICHT vor, in welcher Reihenfolge PostgreSQL die Daten zu retournieren hat. Wird kein Sortierkriterium angegeben, ist die Reihenfolge eher zufällig. Fügen wir in eine leere Tabelle ein, werden die Daten in der Regel in der Reihenfolge des Einfügens ausgelesen - verlassen sollten Sie sich darauf allerdings nicht.

Versuchen wir beispielsweise einen Datensatz zu modifizieren:

test=# UPDATE t_person SET name = name WHERE svnr = '2345';
UPDATE 1
test=# SELECT * FROM t_person LIMIT 2 OFFSET 1;
   svnr   |     name
----------+---------------
 12345678 | Leo Lechner
 2456     | Josef Fischer
(2 rows)

In diesem Fall wird SELECT andere Daten zurückgeben - wollen Sie also die Reihenfolge der Ergebnisse sicherstellen, werden Sie um die Sortierung des Outputs nicht herumkommen. Das ist ein wesentlicher Punkt, auf den wir an dieser Stelle mit allem notwendigen Nachdruck hinweisen wollen.


Cybertec Schönig & Schönig GmbH
PostgreSQL support, training, consulting
www.postgresql-support.de