Nano Hash - криптовалюты, майнинг, программирование

Применить OFFSET и LIMIT в ORACLE для сложных запросов на соединение?

Я использую Oracle 11g и имею сложный запрос на соединение. В этом запросе я действительно хотел применить OFFSET и LIMIT, чтобы эффективно использовать Spring Batch Framework.

Я прошел через: Как ограничить количество строк, возвращаемых запросом Oracle после заказа? и

Альтернативы LIMIT и OFFSET для разбиения по страницам в Oracle

Но мне все не очень понятно.

Мой запрос

SELECT DEPT.ID rowobjid, DEPT.CREATOR createdby, DEPT.CREATE_DATE createddate, DEPT.UPDATED_BY updatedby, DEPT.LAST_UPDATE_DATE updateddate, 
DEPT.NAME name, DEPT.STATUS status, statusT.DESCR statusdesc, 
REL.ROWID_DEPT1 rowidDEPT1, REL.ROWID_DEPT2 rowidDEPT2, DEPT2.DEPT_FROM_VAL parentcid, DEPT2.NAME parentname 
FROM TEST.DEPT_TABLE DEPT 
LEFT JOIN TEST.STATUS_TABLE statusT ON DEPT.STATUS = statusT.STATUS 
LEFT JOIN TEST.C_REL_DEPT rel ON DEPT.ID=REL.ROWID_DEPT2 
LEFT JOIN TEST.DEPT_TABLE DEPT2 ON REL.ROWID_DEPT1=DEPT2.ID
ORDER BY rowobjid asc;

Вышеупомянутый запрос дает мне 10 миллионов записей.

Примечание. Ни в одной из таблиц базы данных нет PK, поэтому мне нужно использовать OFFSET и LIMIT.


Ответы:


1

Вы можете использовать аналитические функции, такие как ROW_NUMBER(), в подзапросе для Oracle 11g, предполагая, что вам нужно получить строки, ранжированные от 3-го до 8-го, чтобы захватить логику OFFSET 3 LIMIT 8 в базе данных Oracle (действительно, эти предложения включены для версий 12c+ < / em>), когда результат должен быть сгруппирован по CREATE_DATE и упорядочен по ID отделам:

SELECT q.*
  FROM (SELECT DEPT.ID rowobjid,
               DEPT.CREATOR createdby,
               DEPT.CREATE_DATE createddate,
               DEPT.UPDATED_BY updatedby,
               DEPT.LAST_UPDATE_DATE updateddate,
               DEPT.NAME name,
               DEPT.STATUS status,
               statusT.DESCR statusdesc,
               REL.ROWID_DEPT1 rowidDEPT1,
               REL.ROWID_DEPT2 rowidDEPT2,
               DEPT2.DEPT_FROM_VAL parentcid,
               DEPT2.NAME parentname,
               ROW_NUMBER() OVER (PARTITION BY DEPT.CREATE_DATE ORDER BY DEPT.ID) AS rn
          FROM TEST.DEPT_TABLE DEPT
          LEFT JOIN TEST.STATUS_TABLE statusT
            ON DEPT.STATUS = statusT.STATUS
          LEFT JOIN TEST.C_REL_DEPT rel
            ON DEPT.ID = REL.ROWID_DEPT2
          LEFT JOIN TEST.DEPT_TABLE DEPT2
            ON REL.ROWID_DEPT1 = DEPT2.ID) q
 WHERE rn BETWEEN 3 AND 8;

который возвращает ровно 6 (8–3 + 1) строк. Если вам нужно включить связи (одинаковые значения идентификаторов отделов для каждой даты создания), ROW_NUMBER() следует заменить другой оконной функцией с именем DENSE_RANK(), поскольку все остальные части запроса остаются такими же. В этом случае будет возвращено не менее 6 записей.

21.06.2020
  • Как найти здесь значения MIN и MAX rowCount для использования в разделах Spring Batch? 23.06.2020
  • В этом случае подумайте о том, чтобы отфильтровать rn = 1, всякий раз, когда вы заказываете по dept.id по возрастанию, вы получаете min или упорядочиваете по убыванию, а затем получаете максимальное значение для dept.id и аналогов в ответ в основном запросе @JeffCook. (Вам нужно этому научиться?) 23.06.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование