Heim > Datenbank > MySQL-Tutorial > Wie kann ich die Ergebnisse von Oracle-Abfragen nach der Bestellung einschränken?

Wie kann ich die Ergebnisse von Oracle-Abfragen nach der Bestellung einschränken?

DDD
Freigeben: 2025-01-25 08:32:09
Original
320 Leute haben es durchsucht

How to Limit Oracle Query Results After Ordering?

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

nach 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>
Nach dem Login kopieren
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>
Nach dem Login kopieren
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>
Nach dem Login kopieren
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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage