Выбор всех строк, соответствующих первым 10 идентификаторам в Oracle - PullRequest
0 голосов
/ 20 марта 2020

Эта проблема связана с нумерацией страниц в Oracle. У меня есть две таблицы, LIST и LIST_ITEM с отношением один ко многим. Я пытаюсь реализовать разбиение на страницы по числу списков, где каждый LIST может содержать переменное число LIST_ITEM. По сути, мне нужно получить все строки из LIST_ITEM, соответствующие первым N идентификаторам LIST. Любые мысли о реализации этого в Oracle БД? В идеале без добавления отдельного запроса.

Ранее я использовал JPA EntityManager для реализации разбиения на страницы с использованием setFirstResult () и setMaxResults (), но поскольку число строк, которые должен возвращать этот запрос, является переменной, это больше не будет работать для я.

1 Ответ

2 голосов
/ 20 марта 2020

Вы можете использовать analyti c функцию , такую ​​как dense_rank() в подзапросе, чтобы ранжировать идентификаторы, а затем отфильтровать по разрядам, которые вы хотите, например:

select id, col1, col2
from (
  select id, col1, col2, dense_rank() over (order by id) as rnk
  from list_items
)
where rnk <= 10

или для более поздних страниц

select id, col1, col2
from (
  select id, col1, col2, dense_rank() over (order by id) as rnk
  from list_items
)
where rnk > 10 and <= 20

Если у вас есть идентификатор в таблице списка без идентификаторов, и вы хотите принять их во внимание, тогда вы можете использовать подзапрос для этой таблицы и объединение (которое позволяет включать и другие столбцы списка):

select l.id, li.col1, li.col2
from (
  select id, dense_rank() over (order by id) as rnk
  from list
) l
left join list_items li on li.id = l.id
where l.rnk <= 10;

Если вы используете Oracle 12 c или выше, вы можете использовать усовершенствования [ограничение строки], чтобы упростить это:

select l.id, li.col1, li.col2
from (
  select id
  from list
  order by id
  fetch next 10 rows only
) l
left join list_items li on li.id = l.id;

или для второй страницы:

  offset 10 rows fetch next 10 rows only
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...