0

我有一个从表中获取接下来 20 行的 SQL 语句。表中有一个名为 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 数量的行,而不是获取下一个 X 数量的行。可能吗?

4

2 回答 2

2

首先,您应该始终使用ORDER BYwith FETCH FIRST。SQL 表和结果集(没有ORDER BY)表示无序集。所以结果可能不稳定。

现在,这并不能完全满足您的要求,但它可能会满足您的要求。OracleWITH TIES支持FETCH NEXT. 这将让您获得最后一个系列 id 的所有数据:

SELECT PRIMARY_KEY, TEXT_FIELD, SERIES_ID
FROM MY_TABLE 
ORDER BY SERIES_ID
OFFSET 0 FETCH NEXT 3 ROWS ONLY WITH TIES;
于 2018-07-04T11:42:56.557 回答
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 中的值,因此您必须使用 dense_rank 进行分页。

于 2018-07-04T09:34:13.040 回答