Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

So ziemlich dringend! LIMIT bei Oracle. Wie?





Frage

Hi, kennt jemand eine Möglichkeit in Oracle das Ergebnis einer Abfrage auf eine bestimmte Anzahl von Datensätzen zu beschränken? In mySQL gibt es hierzu eine LIMIT-Klausel. z.B: select * from tabelle limit 0, 10 Dies gibt die ersten zehn Datensätze aus, selbst wenn Tausend in der Tabelle stehen. Wie mache ich es in Oracle? Gruss, Michael

Antwort 1 von Kessok

Hallo Michael,

vielleicht hilft Dir die Pseudospalte RowNum weiter.

1. Bsp.:

select spalte1,
rownum
from tabelleXY
where rownum < 10;

2. Bsp.:

select spalte1,
rownum
from tabelleXY
having rownum between 100 and 110
group by spalte1, rownum;

Das 1. Beispiel funktioniert nur, wenn man < einschränkt. Ein > oder BETWEEN liefert kein Ergebnis. Daher das 2. Beispiel. Hier wird leider die Gruppierung der ganzen Spalten verlangt.

Eine andere Möglichkeit kenne ich leider auch nicht. Mal sehen wer sich sonst noch meldet.

Gruß
Kessok

Antwort 2 von abc123

@Kessok
Danke. Das scheint momentan die einzige Möglichkeit zu sein.
Ziemlich umständlich und nicht ganz das, was ich suche (seitenweise etwas ausgeben), aber mit paar Tricks kann man es doch verwenden.

Gruss,
Michael

Antwort 3 von Kessok

@Michael

Seitenweise??
Wie wärs denn mit SET PAGESIZE X. Damit kann man einstellen, nach wieviel Zeilen die Spaltenüberschriften wiederholt werden sollen.
Mit SET LINESIZE X definiert man die Zeilenlänge. Beides sollte man einstellen für druckbare Ergebnisdateien.

Gruß
Kessok

Antwort 4 von abc123

Hi,

Habe noch einfachere Methode gefunden.
Stichwort: Sub-Query

SELECT *
FROM (
SELECT t.*, RowNum AS RNUM
FROM Tabelle t
WHERE ...usw
)
WHERE RNUM BETWEEN StartOffset AND EndOffset

(Das mit dem t.* nur als Beispiel)

Funktionert einwandfrei.
Um das ganze noch effizienter zu machen, kann man die Sub-Query auf Zeilen <= EndOffset begränzen.

SELECT *
FROM (
SELECT t.*, RowNum AS RNUM
FROM Tabelle t
WHERE RowNum<=EndOffset...usw
)
WHERE RNUM BETWEEN StartOffset AND EndOffset

Der Vorteil dieser Lösung ist, dass man die eigentliche Abfrage nur um die Pseudospalte zu erweitern braucht.
Der Rest kommt rundherum:

select *
from ( Abfrage )
where ...usw.

Gruss,
Michael