2014-11-24 8 views
7

Wie Sie einen Offset in einer "Select" -Abfrage in Oracle 11g hinzufügen. Ich weiß nur, wie das Limit von z. B. rownum <= 5 hinzufügen, diese Frage ist kein Duplikat, ich habe bereits die anderen Fragen überprüft und sind nicht mit mir verwandt.Wie Offset in einer "Select" -Abfrage in Oracle 11g hinzufügen?

Also, wie den Offset in Oracle 11g hinzufügen?

+2

http://use-the-index-luke.com/sql/partial-results –

+0

Die Frage hilft sollte Ihre Bedeutung von neu gefasst Offset kann mit der OFFSET-Klausel in Zusammenhang stehen oder nicht. –

Antwort

13

Sie es auf 12cOFFSET durch Angabe leicht tun können.

In 12c,

SELECT val 
FROM table 
ORDER BY val 
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY; 

das gleiche auf 11g zu tun und vor, müssen Sie ROWNUM zweimal verwenden, inner query und outer query sind.

Die gleiche Abfrage in 11g,

SELECT val 
FROM (SELECT val, rownum AS rnum 
     FROM (SELECT val 
       FROM table 
       ORDER BY val) 
     WHERE rownum <= 8) 
WHERE rnum > 4; 

Hier OFFSET ist 4.

+0

können Sie ein Beispiel für negativen Offset hinzufügen ??? – psaraj12

+1

dieser eine gearbeitet .... danke viel – sasori

+1

@ psaraj12, wenn Sie Zeilen in absteigender Reihenfolge erhalten wollen, dann verwenden Sie 'DESC' in 'innere Abfrage'. –

0

die Funktion LAG oder LEAD in Oracle verwenden

The LAG function is used to access data from a previous row 

The LEAD function is used to return data from the next row 

Verbrauch: -

LAG (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause) 
LEAD (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause) 

finden Sie die this link Beispiele

+0

Alles, was Sie brauchen, ist 'ROWNUM' –

+0

@Lalit Kumar B. was Sie geschrieben haben macht Sinn, solange die Zeilen in der Ausgabe betroffen sind. Ich würde sagen, dass die Frage nicht vollständig klar ist und neu formuliert werden sollte (der Versatz kann anders verstanden werden). –

1

Sie ROW_NUMBER Funktion dafür verwenden können.

Vielleicht hilft:

SELECT * 
    FROM(SELECT t.*, 
       ROW_NUMBER() OVER (ORDER BY ...) rn -- whatever ordering you want 
     FROM your_table t 
    ) 
WHERE rn >= ... -- your offset 

Hoffnung, die