我有一条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的行。有可能吗?
答案 0 :(得分:2)
首先,您应始终将ORDER BY
与FETCH 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进行分页。