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
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
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
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
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

