Gibt es eine Möglichkeit, eine Oracle
Abfrage so zu verhalten, als ob sie eine MySQL limit
Klausel enthält ?
In MySQL
kann ich das tun:
select *
from sometable
order by name
limit 20,10
Um die 21. bis 30. Reihe zu erhalten (überspringen Sie die ersten 20, geben Sie die nächsten 10 an). Die Zeilen werden nach dem ausgewählt order by
, so dass es wirklich mit dem 20. Namen alphabetisch beginnt.
In Oracle
, das einzige , was Leute erwähnen ist die rownum
Pseudo-Spalte, aber es wird ausgewertet , bevor order by
, was bedeutet dies:
select *
from sometable
where rownum <= 10
order by name
gibt einen zufälligen Satz von zehn nach Namen geordneten Zeilen zurück, was normalerweise nicht das ist, was ich will. Es ist auch nicht möglich, einen Versatz anzugeben.
sql
oracle
pagination
sql-limit
Mathieu Longtin
quelle
quelle
ORDER BY
. Das ist der springende Punkt bei der Bestellung. Wenn sich die zugrunde liegenden Daten ändern und sich Ihre Ergebnismenge aufgrund dessen ändert, zeigen Sie dem Benutzer dann die aktualisierten Ergebnisse anstelle veralteter Informationen an. Auch das Staatsmanagement ist eine Plage, die so weit wie möglich vermieden werden sollte. Es ist eine ständige Quelle von Komplikationen und Fehlern. Deshalb wird funktional immer beliebter. Und wann würden Sie wissen, dass die gesamte Ergebnismenge im Speicher abläuft? Im Web können Sie nicht wissen, wann der Benutzer das Web verlässt.Antworten:
Ab Oracle 12c R1 (12.1) gibt es eine Zeilenbegrenzungsklausel . Es verwendet keine vertraute
LIMIT
Syntax, kann aber mit mehr Optionen die Arbeit besser erledigen. Die vollständige Syntax finden Sie hier . (Lesen Sie in dieser Antwort auch mehr darüber, wie dies intern in Oracle funktioniert .)Um die ursprüngliche Frage zu beantworten, ist hier die Abfrage:
(Informationen zu früheren Oracle-Versionen finden Sie in anderen Antworten in dieser Frage.)
Beispiele:
Die folgenden Beispiele wurden von der verlinkten Seite zitiert , in der Hoffnung, Linkfäule zu verhindern.
Installieren
Was ist in der Tabelle?
Holen Sie sich die ersten
N
ZeilenHolen ersten
N
Reihen, wennN
th Reihe Bindungen hat, erhalten alle gebunden ReihenTop
x
% der ZeilenVerwendung eines Versatzes, sehr nützlich für die Paginierung
Sie können Offset mit Prozentsätzen kombinieren
quelle
OFFSET FETCH
Syntax ist eine Syntax Zucker. DetailsSie können hierfür eine Unterabfrage verwenden
Weitere Informationen finden Sie auch im Thema Zu ROWNUM und zur Einschränkung der Ergebnisse bei Oracle / AskTom.
Update : Um das Ergebnis sowohl auf die Unter- als auch auf die Obergrenze zu beschränken, werden die Dinge etwas aufgeblähter
(Aus dem angegebenen AskTom-Artikel kopiert)
Update 2 : Ab Oracle 12c (12.1) steht eine Syntax zur Verfügung, mit der Zeilen begrenzt oder bei Offsets begonnen werden können.
Weitere Beispiele finden Sie in dieser Antwort . Danke an Krumia für den Hinweis.
quelle
Ich habe einige Leistungstests für die folgenden Ansätze durchgeführt:
Asktom
Analytisch
Kurze Alternative
Ergebnisse
Die Tabelle hatte 10 Millionen Datensätze. Die Sortierung erfolgte in einer nicht indizierten Datums- / Uhrzeitzeile:
Die Auswahl der ersten 10 Zeilen dauerte:
Zeilen zwischen 100.000 und 100.010 auswählen:
Zeilen zwischen 9.000.000 und 9.000.010 auswählen:
quelle
BETWEEN
ist nur eine Abkürzung für>= AND <=
( stackoverflow.com/questions/4809083/between-clause-versus-and )offset
Syntax hat den gleichen Plan und die gleiche Leistung wie der analytische Ansatz.Eine analytische Lösung mit nur einer verschachtelten Abfrage:
Rank()
könnte ersetzt werdenRow_Number()
, könnte aber mehr Datensätze zurückgeben, als Sie erwarten, wenn es doppelte Werte für den Namen gibt.quelle
rank()
, ist es auch erwähnenswert,dense_rank()
was für die Ausgabesteuerung nützlicher sein kann, da letztere keine Zahlen "überspringt", wohingegen dies möglichrank()
ist. In jedem Fall ist diese Fragerow_number()
am besten geeignet. Eine andere nicht ist, dass diese Technik auf jede Datenbank anwendbar ist, die die genannten Funktionen unterstützt.Unter Oracle 12c (siehe Zeilenbegrenzungsklausel in der SQL-Referenz ):
quelle
LIMIT
SQL: 2008 zu einigen, mussten sie natürlich ein Blatt aus Microsofts Buch herausnehmen und den Standard brechen.LIMIT ... OFFSET
LIMIT n, m
(siehe meine Antwort). Andererseits sollte OracleLIMIT n, m
als syntaktischen Zucker implementiert haben , wie es äquivalent zu istOFFSET n ROWS FETCH NEXT m ROWS ONLY
.Paginierungsabfragen bei der Bestellung sind in Oracle sehr schwierig.
Oracle stellt eine ROWNUM-Pseudospalte bereit, die eine Zahl zurückgibt, die die Reihenfolge angibt, in der die Datenbank die Zeile aus einer Tabelle oder einem Satz verbundener Ansichten auswählt.
ROWNUM ist eine Pseudospalte, die viele Menschen in Schwierigkeiten bringt. Ein ROWNUM-Wert wird einer Zeile nicht dauerhaft zugewiesen (dies ist ein häufiges Missverständnis). Es kann verwirrend sein, wenn tatsächlich ein ROWNUM-Wert zugewiesen wird. Ein ROWNUM-Wert wird einer Zeile zugewiesen, nachdem Filterfilterprädikate der Abfrage übergeben wurden, jedoch bevor die Abfrage aggregiert oder sortiert wird .
Darüber hinaus wird ein ROWNUM-Wert erst nach seiner Zuweisung erhöht.
Aus diesem Grund gibt die folgende Abfrage keine Zeilen zurück:
Die erste Zeile des Abfrageergebnisses übergibt nicht das Prädikat ROWNUM> 1, sodass ROWNUM nicht auf 2 erhöht wird. Aus diesem Grund wird kein ROWNUM-Wert größer als 1, sodass die Abfrage keine Zeilen zurückgibt.
Eine korrekt definierte Abfrage sollte folgendermaßen aussehen:
Weitere Informationen zu Paginierungsabfragen finden Sie in meinen Artikeln im Vertabelo- Blog:
quelle
SQL Standard
Wie in diesem Artikel erläutert , bietet der SQL: 2008-Standard die folgende Syntax, um die SQL-Ergebnismenge einzuschränken:
Oracle 11g und ältere Versionen
Vor Version 12c mussten Sie zum Abrufen der Top-N-Datensätze eine abgeleitete Tabelle und die Pseudospalte ROWNUM verwenden:
quelle
Weniger SELECT-Anweisungen. Auch weniger leistungsaufwendig. Credits an: [email protected]
quelle
Als Erweiterung der akzeptierten Antwort verwendet Oracle intern
ROW_NUMBER/RANK
Funktionen.OFFSET FETCH
Syntax ist eine Syntax Zucker.Es konnte unter Verwendung des folgenden
DBMS_UTILITY.EXPAND_SQL_TEXT
Verfahrens beobachtet werden :Probe vorbereiten:
Abfrage:
ist regelmäßig:
db <> Geigen-Demo
Abrufen von erweitertem SQL-Text:
WITH TIES
wird erweitert alsRANK
:und Offset:
quelle
Wenn Sie nicht mit Oracle 12C arbeiten, können Sie die TOP N-Abfrage wie folgt verwenden.
Sie können dies sogar wie folgt aus der Klausel in die Klausel verschieben
Hier erstellen wir tatsächlich eine Inline-Ansicht und benennen rownum in rnum um. Sie können rnum in der Hauptabfrage als Filterkriterium verwenden.
quelle
ORDER BY
und dasrownum
separat zu tun . Grundsätzlich habe ich eine Unterabfrage erstellt, die dieORDER BY
Klausel hatte .rownum
betraf die Begrenzung nach dem Sortieren, sollte also außerhalb einer Unterabfrage liegen.Ich habe begonnen, mich auf die Oracle 1z0-047-Prüfung vorzubereiten, die gegen 12c validiert wurde. Als ich mich darauf vorbereitete, stieß ich auf eine 12c-Verbesserung, die als "FETCH FIRST" bekannt ist. Sie ermöglicht es Ihnen, Zeilen nach Belieben abzurufen / zu begrenzen. Damit stehen mehrere Optionen zur Verfügung
Beispiel:
quelle
größer als Werte herausfinden
weniger als Werte herausfinden
quelle
ROW_NUMBER()
basierte Lösung wurde bereits von Leigh Riffel veröffentlicht. In der Sucht werden Syntaxfehler im angezeigten Code angezeigt.Für jede von einer Abfrage zurückgegebene Zeile gibt die Pseudospalte ROWNUM eine Zahl zurück, die die Reihenfolge angibt, in der Oracle die Zeile aus einer Tabelle oder einem Satz verbundener Zeilen auswählt. Die erste ausgewählte Zeile hat eine ROWNUM von 1, die zweite hat 2 und so weiter.
Ich habe dies in
oracle
Server implementiert11.2.0.1.0
quelle
Bei SQL-Developer werden automatisch nur die ersten 50 Zeilen abgerufen. Und wenn wir nach unten scrollen, werden weitere 50 Zeilen abgerufen und so weiter!
Daher müssen wir im Falle eines SQL-Entwickler-Tools nicht definieren!
quelle
Im Orakel
VAL
5 Zeilen ausgewählt.
SQL>
quelle
(ungetestet) so etwas kann den Job machen
Es gibt auch den Rang der Analysefunktion, nach dem Sie bestellen können.
quelle
Gleich wie oben mit Korrekturen. Funktioniert aber definitiv nicht schön.
Ehrlich gesagt, besser, die obigen Antworten zu verwenden.
quelle