SQL-Befehl für best. Datensatzauswahl

Hallo,

ich möchte es realisieren, dass meine Bildschirmausgabe gegliedert ist in mehrere Seiten, z.B. >
Jetzt würde ich nur noch einen Befehl suchen, der z.B. die ersten 5 Datensätze ausließt, und wenn ich die 2 Drücke die zweiten 5 Datensätze.
Ich weiss da gibt es einen Befehl, aber ich finde ihn nicht mehr.

Oder könnte das was ich schreiben will noch schöner realisiert werden?

danke

So, ein bischen weiter bin ich jetzt schon, aber:
Folgendes habe ich gemacht:
select ROWNUM, id from test_table where ROWNUM between 1 and 5;

jo, ich bekomme die ersten 5 Datensätze, gebe ich jetzt aber
select ROWNUM, id from test_table where ROWNUM between 2 and 5;

ein bekomme ich nur

>>Es wurden keine Zeilen ausgewählt

super, hat da jemand eine Idee?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Andi!

Die Einschränkung eines SELECTS mit ROWNUM (ich gehe hier mal davon aus du arbeitest mit Oracle) liefert sicher nicht das von dir erwartete Ergebnis. ROWNUM nummeriert einfach mal die vom SELECT ausgewählten Sätze. Wenn Du also zum Beispiel WHERE ROWNUM=2 schreibst, adnn liefert der SELECT immer die leere Menge, weil ja ROWNUM für den ersten Ergebnissatz 1 ist, der entspricht aber nicht der WHERE Klausel, wird also nicht selektiert, er geht weiter zum zweiten Datensatz, der kriegt (weil ja noch nichts selektiert wurde) gleich wieder mal die ROWNUM=1, entspricht aber nicht usw…

Am einfachsten (und performantesten) lässt sich das, was du da machen willst über eine PL/SQL-Prozedur machen, in der du dir mit einem Cursor immer einen vordefinierten Block von Ergebnissen aus geben lässt (den Cursor darfst Du zwischen den Abfragen natürlich nicht schliessen, sonst beginnt er wieder von vorne).

Weiters fällt mir noch dies hier ein:

SELECT name, preis FROM (SELECT name, preis, rownum rn FROM artikel) WHERE rn BETWEEN 1 AND 5;

Alternativ gibt es auch die Möglichkeit (wenn Du gegen eine Sortierung der Datensätze nichts einzuwenden hast) mittels eines nicht ganz trivialen Subselects die „grössten“ 5, die „zweitgrössten“ 5 usw. Datensätze auszuwählen.
Sieht dann etwa für die Artikel mit den grössten 5 Preisen so aus:

SELECT \* FROM artikel o 
WHERE 5\>(SELECT count(\*) FROM artikel i WHERE i.preis\>o.preis);

Ein Problemchen hast Du hier noch: Der obige SELECT gibt unter Umständen auch 100 Sätze aus, dann nämlich, wenn 100 Artikel den gleichen (höchsten) Preis haben…

Hier möchte ich noch auf den zweiten beliebten ROWNUM-Irrtum hinweisen:

SELECT name,preis FROM artikel WHERE rownum
liefert [b]nicht[/b] die Artikel mit den 5 höchsten Preisen, sondern irgendwelche 5 Artikel, die dafür nach Preis absteigend sortiert. Der Grund: Das ORDER BY wird erst [b]nach[/b] dem WHERE ausgeführt (eigentlich logisch - warum sollte zuerst sortiert werden und erst danach die Sätze eliminiert, die gar nicht ausgegeben werden sollen).

Weiters gibt's ab 8.1.7 (?) die "analytical functions", namentlich sollte dir RANK() da weiterhelfen können, da hab' ich allerdings selbst noch keine Erfahrungen damit.

Stehe natürlich gerne für Rückfragen zur Verfügung.