Heim > Datenbank > MySQL-Tutorial > Wie können Sie die Abfrageergebnisse effizient einschränken und in Oracle ausgleichen?

Wie können Sie die Abfrageergebnisse effizient einschränken und in Oracle ausgleichen?

Mary-Kate Olsen
Freigeben: 2025-01-25 08:52:11
Original
848 Leute haben es durchsucht

How to Efficiently Limit and Offset Query Results in Oracle?

Zeilenbegrenzung und -versatz in Oracle-Abfragen beherrschen

Oracles ROWNUM Pseudospalte, die häufig zur Einschränkung von Ergebnismengen verwendet wird, stellt in Kombination mit der Reihenfolge eine einzigartige Herausforderung dar. Im Gegensatz zur LIMIT-Klausel von MySQL, die nach dem Sortieren gilt, ROWNUM filtert bevor die ORDER BY-Klausel verarbeitet wird. Das bedeutet, dass die einfache Verwendung von ROWNUM nicht garantiert, dass eine bestimmte geordnete Teilmenge Ihrer Ergebnisse vorliegt.

Der Standardansatz (alle Oracle-Versionen):

Um das Äquivalent der LIMIT-Funktionalität von MySQL zu erreichen, verwenden Sie eine verschachtelte Abfrage:

<code class="language-sql">SELECT *
FROM (
    SELECT *
    FROM emp
    ORDER BY sal DESC
)
WHERE ROWNUM <= 5;</code>
Nach dem Login kopieren

Dieser Ansatz ordnet zunächst die Daten und wendet dann den ROWNUM-Filter an, um sicherzustellen, dass die fünf höchsten Gehälter zurückgegeben werden.

Aufrechnungs- und Begrenzungsergebnisse:

Für eine anspruchsvollere Steuerung erfordert die Angabe eines Offsets und eines Grenzwerts eine etwas komplexere Abfrage:

<code class="language-sql">SELECT *
FROM (
    SELECT a.*, ROWNUM rnum
    FROM (
        SELECT *  -- Your main query with ORDER BY clause
        FROM some_table
        ORDER BY some_column
    ) a
    WHERE ROWNUM <= :MAX_ROW_TO_FETCH
)
WHERE rnum >= :MIN_ROW_TO_FETCH;</code>
Nach dem Login kopieren

Ersetzen Sie :MAX_ROW_TO_FETCH und :MIN_ROW_TO_FETCH durch die gewünschte Ober- und Untergrenze. Dadurch werden nach der Bestellung Zeilen innerhalb eines bestimmten Bereichs abgerufen.

Oracle 12c und höher: Die FETCH-Klausel:

Oracle 12c (und spätere Versionen) bieten eine elegantere Lösung mit der FETCH-Klausel:

<code class="language-sql">-- Retrieve the first 10 rows
SELECT *
FROM sometable
ORDER BY name
FETCH FIRST 10 ROWS ONLY;

-- Retrieve rows 20-30
SELECT *
FROM sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;</code>
Nach dem Login kopieren

Die FETCH-Klausel bietet eine sauberere und besser lesbare Möglichkeit, Ergebnisse einzuschränken und auszugleichen, was sie zur bevorzugten Methode für Oracle 12c und höher macht. Für ältere Versionen bleibt der Ansatz der verschachtelten Abfrage erforderlich.

Das obige ist der detaillierte Inhalt vonWie können Sie die Abfrageergebnisse effizient einschränken und in Oracle ausgleichen?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage