2012-04-10 6 views
2

Ich möchte diese SQL-Abfrage verwenden, um nur die Datensätze zwischen 8 und 10 zu erhalten:Erhalten Bereich von Datensätzen aus SQL-Abfrage Oracle

select * 
from(
SELECT a.*,rownum rn 
FROM ACTIVESESSIONSLOG a 
ORDER BY USERID ASC) 
WHERE rn >= 8 and rn <= 10 

Wenn ich implementieren diese SQL-Abfrage in Paginierung ich jedes Mal, 1 Zeile erhalten die zweite Seite, egal wie viele Zeilen ich konfiguriert habe, um auf den Seiten angezeigt zu werden. Ist diese SQL-Abfrage gültig?

Dies ist die Tabellenstruktur:

-- TABLE ACTIVESESSIONSLOG 

CREATE TABLE ACTIVESESSIONSLOG(
    ASESSIONID VARCHAR2(30) NOT NULL, 
    USERID VARCHAR2(30), 
    ACTIVITYSTART TIMESTAMP(6), 
    ACTIVITYEND TIMESTAMP(6), 
    ACTIVITY CLOB 
) 
/

Beste Wünsche

+0

Ändern Sie die interne Abfrage, wenn Sie nach der zweiten Seite suchen? –

+0

Abfrage sieht korrekt aus, aber ich kann nicht verstehen, was das Problem wirklich ist. – hkutluay

+0

Wie viele Zeilen werden genau dann zurückgegeben, wenn Sie keine WHERE-Klausel haben? Und was genau wird die Abfrage für Seite 2 ausgeführt? (Nicht was du weißt * sollte * sein, aber was hast du gefunden, als du deinen Code debuggt hast?) – MatBailie

Antwort

4

rownum vor der ORDER BY angelegt wird, so wird Ihre Anfrage an Sicherheit grenzender Wahrscheinlichkeit nicht zu tun, was Sie erwarten. Ihre Abfrage fragt im Wesentlichen nach einer beliebigen 3 Zeilen und die ORDER BY tut nichts nützliches.

könnten Sie verwenden, um die analytische Funktion row_number statt, dh

SELECT * 
    FROM (SELECT a.*, 
       row_number() over (order by userid asc) rn 
      FROM activeSessionsLog a) 
WHERE rn BETWEEN 8 AND 10 

die wird durch die Ergebnisse

SQL> ed 
Wrote file afiedt.buf 

    1 select empno, ename, job 
    2 from (select e.*, 
    3     row_number() over (order by empno) rn 
    4   from emp e) 
    5* where rn between 1 and 3 
SQL>/

    EMPNO ENAME  JOB 
---------- ---------- --------- 
     7369 SMITH  CLERK 
     7499 ALLEN  SALESMAN 
     7521 WARD  SALESMAN 

SQL> ed 
Wrote file afiedt.buf 

    1 select empno, ename, job 
    2 from (select e.*, 
    3     row_number() over (order by empno) rn 
    4   from emp e) 
    5* where rn between 4 and 8 
SQL>/

    EMPNO ENAME  JOB 
---------- ---------- --------- 
     7566 JONES  MANAGER 
     7654 MARTIN  SALESMAN 
     7698 BLAKE  MANAGER 
     7782 CLARK  MANAGER 
     7788 SCOTT  ANALYST 

SQL> ed 
Wrote file afiedt.buf 

    1 select empno, ename, job 
    2 from (select e.*, 
    3     row_number() over (order by empno) rn 
    4   from emp e) 
    5* where rn between 9 and 11 
SQL>/

    EMPNO ENAME  JOB 
---------- ---------- --------- 
     7839 KING  PRESIDENT 
     7844 TURNER  SALESMAN 
     7876 ADAMS  CLERK 

es effizienter sein kann, aber so etwas zu tun, wo Oracle kann Verwenden Sie das innere Prädikat, um zu wissen, dass es die Daten sortieren kann, sobald es die ersten 10 Zeilen identifiziert hat.

+0

Sehr gute Antwort. –

0

Seit Oracle 12c können Sie jetzt Offset/Fetch-Klausel verwenden.

Sie können nun Anfragen wie schreiben:

SELECT * 
FROM user_objects 
ORDER object_name 
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY 

diesen Plan new feature und beachten Sie auch die Verbesserungen bei der Ausführung Bitte überprüfen.

Verwandte Themen