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.