Heim >Datenbank >MySQL-Tutorial >Wie kann ich die Ergebnisse von Oracle-Abfragen nach der Bestellung einschränken?
Konzises Eingrenzen geordneter Ergebnisse in Oracle
Die Zeilenbeschränkung von Oracle unterscheidet sich von einfacheren SQL-Dialekten wie MySQL. Während MySQL LIMIT
verwendet, verwendet Oracle die Pseudospalte ROWNUM
. Die direkte Verwendung von ROWNUM
in einer WHERE
-Klausel vor ORDER BY
führt jedoch zu unvorhersehbaren Ergebnissen.
Die Herausforderung: Bestellen, dann einschränken
Das Problem ergibt sich aus der Bewertung von ROWNUM
vorder -Klausel. Das bedeutet, dass Sie nach dem Sortieren nicht die obersten N Zeilen erhalten; Stattdessen erhalten Sie N beliebige Zeilen.ORDER BY
Die Lösung: Unterabfragen für präzise Steuerung
Um Zeilennach der Reihenfolge korrekt einzuschränken, verwenden Sie eine Unterabfrage:
<code class="language-sql">SELECT * FROM ( SELECT * FROM emp ORDER BY sal DESC ) WHERE ROWNUM <= 10;</code>Dies sortiert zunächst die
-Tabelle nach Gehalt (emp
) absteigend, dann wählt die äußere Abfrage nur die obersten 10 Zeilen mit sal
aus.ROWNUM
Start- und Endzeilen angeben:
Für eine genauere Steuerung sind für die Definition sowohl der oberen als auch der unteren Grenzen verschachtelte Unterabfragen erforderlich:
<code class="language-sql">SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT * FROM emp ORDER BY sal DESC ) a WHERE ROWNUM <= 30 ) WHERE rnum >= 21;</code>Dadurch werden die Zeilen 21–30 (einschließlich) nach der Sortierung nach Gehalt abgerufen.
Modernes Oracle (12c und höher): Vereinfachte Syntax
Oracle 12c und spätere Versionen bieten einen saubereren Ansatz:
<code class="language-sql">-- Top 10 results SELECT * FROM sometable ORDER BY name FETCH FIRST 10 ROWS ONLY; -- Rows 20-30 SELECT * FROM sometable ORDER BY name OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;</code>Diese
- und FETCH FIRST
-Syntax ist für die Paginierung deutlich lesbarer und effizienter. Verwenden Sie diese Methode, wenn Ihre Oracle-Version sie unterstützt.OFFSET
Das obige ist der detaillierte Inhalt vonWie kann ich die Ergebnisse von Oracle-Abfragen nach der Bestellung einschränken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!