我有一个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 BY
与FETCH FIRST
一起使用。 SQL 表和结果集(不带ORDER BY
(表示无序集。 所以结果可能并不稳定。
现在,这并不能完全满足您的要求,但它可能会满足您的要求。 Oracle 支持FETCH NEXT
的WITH 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 进行分页。