Oracle SQL FETCH NEXT Across Several Rows



我有一个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 行数,而是从表中获取下一个 X 数量的SERIES_IDs。 可能吗?

首先,您应该始终将ORDER BYFETCH FIRST一起使用。 SQL 表和结果集(不带ORDER BY(表示无序集。 所以结果可能并不稳定。

现在,这并不能完全满足您的要求,但它可能会满足您的要求。 Oracle 支持FETCH NEXTWITH TIES选项。 这将允许您获取最后一个序列 id 的所有数据:

SELECT PRIMARY_KEY, TEXT_FIELD, SERIES_ID
FROM MY_TABLE 
ORDER BY SERIES_ID
OFFSET 0 FETCH NEXT 3 ROWS ONLY WITH TIES;

您需要使用分析函数(例如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 进行分页。

最新更新