跨几行的Oracle SQL FETCH NEXT

时间:2018-07-04 09:14:17

标签: sql oracle

我有一条SQL语句,该语句从表中提取接下来的20行。表中有一个名为SERIES_ID的字段,其中包含表中几行可能共享的值,例如:

MY_TABLE
PRIMARY_KEY |  TEXT_FIELD | SERIES_ID
===================================
1           | sdfdsfdsfds |    1001
2           | sdafsdfdf   |    1002
3           | sdffghhjhj  |    1002
4           | rttrytrytyu |    1002
5           | qweqwret    |    1003
6           | gvcbvcbcv   |    1003

SELECT 
    PRIMARY_KEY, 
    TEXT_FIELD, 
    SERIES_ID
FROM MY_TABLE 
OFFSET 0 
FETCH NEXT 3 ROWS ONLY;

我想做的是更改我的SQL语句,以便从表中获取下一个X的SERIES_ID,而不是获取下一个X的行。有可能吗?

2 个答案:

答案 0 :(得分:2)

首先,您应始终将ORDER BYFETCH FIRST一起使用。 SQL表和结果集(不包含ORDER BY)表示无序集。因此结果可能不稳定。

现在,这并不能完全满足您的要求,但可以满足您的要求。 Oracle支持WITH TIES的{​​{1}}选项。这将使您获得最后一个系列ID的所有数据:

FETCH NEXT

答案 1 :(得分:1)

您需要使用解析函数(例如DENSE_RANK())来将序列值标记为数字,然后在where子句中使用,类似于:

SELECT primary_key,
       text_field,
       series_id
FROM   (SELECT primary_key,
               text_field,
               series_id,
               DENSE_RANK() OVER (ORDER BY series_id) dr
        FROM   my_table)
WHERE  dr <= 3;

在OFFSET / FETCH中似乎无法访问值,因此您必须使用density_rank进行分页。