2014-11-24 1 views
7

Как добавить смещение в запросе «select» в Oracle 11g. Я знаю только, как добавить предел, например, rownum <= 5 Этот вопрос не является дубликатом, я уже проверил другие вопросы и не связан с моим.Как добавить смещение в запросе «select» в Oracle 11g?

Итак, как добавить смещение в Oracle 11g?

+2

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

+0

Вопрос следует перефразировать в качестве значения смещение может быть или не быть связано с предложением OFFSET. –

ответ

13

Вы можете сделать это легко на 12c, указав OFFSET.

В 12c,

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

Чтобы сделать то же самое на 11g и до этого, вам нужно использовать ROWNUM дважды, inner query и outer query соответственно.

Тот же самый запрос в 11g,

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

Здесь OFFSET равно 4.

+0

можете ли вы включить пример отрицательного смещения ??? – psaraj12

+1

этот один работал .... спасибо alot – sasori

+1

@ psaraj12, если вы хотите получить строки в порядке убывания, то просто используйте 'DESC' в' inner query'. –

0

Используйте функцию LAG или LEAD в оракула

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

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

Использование: -

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

Пожалуйста найти this link примеры

+0

Все, что вам нужно, это 'ROWNUM' –

+0

@Lalit Kumar B. То, что вы написали, имеет смысл до тех пор, пока речь идет о ограничивающих строках в Ouptut. Я бы сказал, что вопрос не совсем ясен и его следует переформулировать (смещение можно понять по-разному). –

1

Вы можете использовать функцию row_number для этого.

Может быть, это помогает:

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

Надежда, что помогает