Einschränken von Ergebnismengen in geordneten Oracle-Abfragen
Oracles ROWNUM
-Pseudospalte unterscheidet sich von MySQLs LIMIT
-Klausel; ROWNUM
wird zugewiesen, bevor die ORDER BY
-Klausel verarbeitet wird. Daher führt die direkte Verwendung von ROWNUM
nicht zu einer Begrenzung der Zeilen nach der Bestellung. Um dies zu erreichen, verwenden Sie eine Unterabfrage:
<code class="language-sql">SELECT * FROM (SELECT * FROM emp ORDER BY sal DESC) WHERE ROWNUM <= n;</code>
Bei diesem Ansatz wird die emp
-Tabelle zunächst nach Gehalt (sal
) absteigend sortiert, dann verwendet die äußere Abfrage ROWNUM
, um die Ausgabe auf die obersten n
-Zeilen zu beschränken.
Für komplexere Szenarien, die sowohl Ober- als auch Untergrenzen erfordern, ist eine verschachtelte Unterabfrage erforderlich:
<code class="language-sql">SELECT * FROM (SELECT a.*, ROWNUM rnum FROM (SELECT * FROM your_table ORDER BY your_column) a WHERE ROWNUM <= :MAX_ROW_TO_FETCH) WHERE rnum >= :MIN_ROW_TO_FETCH;</code>
Oracle 12c und darüber hinaus
Oracle 12c (und spätere Versionen) bieten eine optimierte Syntax mit FETCH FIRST
und OFFSET
:
<code class="language-sql">SELECT * FROM sometable ORDER BY name FETCH FIRST 10 ROWS ONLY;</code>
Dies begrenzt die Ergebnismenge direkt auf die ersten 10 Zeilen nach der Bestellung durch name
. Um einen Offset anzugeben (z. B. die ersten 20 Zeilen überspringen und die nächsten 10 abrufen), verwenden Sie die OFFSET
-Klausel:
<code class="language-sql">SELECT * FROM sometable ORDER BY name OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;</code>
Ausführliche Beispiele und Strategien zur Leistungsoptimierung finden Sie in der offiziellen Oracle-Dokumentation.
Das obige ist der detaillierte Inhalt vonWie beschränken Sie die Zeilen in Oracle -Abfragen nach der Bestellung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!