Sql - як працює rownum в запиті сторінки oracle - pagination, code q - a російська (ru)

Тому я хочу вибрати ряд рядків в Oracle DB. Мені потрібно зробити це, тому що у мене є мільйони рядків в таблиці, і я хочу, щоб призначені для користувача результати розбивали на сторінки (якщо ви знаєте інший спосіб зробити це на стороні клієнта, я використовую JavaFX, якщо це має значення, але я не Думаю , що це хороша ідея відправити всі дані по мережі, щоб розбивати їх на стороні клієнта).

100 і 110 є всього лише прикладом. У додатку я просто цікавлюся нижню межу і додаю розмір 10_000 для отримання наступних 10_000 рядків.

Тепер в результаті з'являється стовпець rownum, і я не хочу його бачити. Оскільки я не дуже розбираюся в SQL, ось мої питання:

  1. Чому (це була моя перша спроба, поки я не Select * From Person Where rownum> 100 and rownum <110; SO). Select * From Person Where rownum> 100 and rownum <110; Возвращает 0 строк?

Чому немає простого способу зробити щось на зразок Select. FROM. WHERE rownum BETWEEN lowerBound AND upperBound.

Як позбутися від стовпчика r в результуючих значеннях? Звідти SQL виключає стовпець, використовуючи SELECT * [except columnA] FROM tableA? Мені потрібно, мабуть, створити уявлення або тимчасову таблицю, але чи є інший спосіб з урахуванням мого запиту?

Чи забезпечує він правильну розбивку на сторінки? Я прочитав розділ цієї статті «Розбиття сторінки за допомогою ROWNUM», який сказав, що я повинен замовляти значення чимось унікальним, щоб отримати послідовну розбивку на сторінки (так що я думаю, що впорядкування по rownum в порядку, якщо ви можете підтвердити) . Хіба це не перемагає мета використання FIRST_ROWS (N).

Я сподіваюся, що це не дуже багато, я міг би розділити на окремі питання, але я думаю, що важливо, щоб вони впали, оскільки вони тісно пов'язані.

У вас є 4 питання, і всі вони обертаються навколо використання і функціональності ROWNUM. Я буду відповідати на кожне питання один за іншим.

Чому (це була моя перша спроба, поки я не пошукати SO). Виберіть * Від людини, де rownum> 100 і rownum <110; Возвращает 0 строк?

Гарне пояснення Томаса Кіта щодо ROWNUM і розбивки на сторінки тут.

Значення ROWNUM присвоюється рядку після проходження фази предиката запиту, але до того, як запит виконає будь-яку сортування або агрегацію. Крім того, значення ROWNUM збільшується тільки після того, як воно призначене, тому наступний запит ніколи не поверне рядок:

Оскільки ROWNUM> 1 не відповідає першому рядку, ROWNUM не переходить до 2. Отже, жодне значення ROWNUM ніколи не буде більше 1.

Чому немає простого способу зробити щось на зразок Select. FROM. WHERE rownum МІЖ lowerBound AND upperBound?

Так є. Починаючи з Oracle 12c. ви можете використовувати нову функцію обмеження Top-n Row. Див. Моя відповідь тут.

Наприклад, наведений нижче запит поверне співробітникам від 4 до 7 найвищих зарплат в порядку зростання:

Як позбутися від стовпчика r в результуючих значеннях?

Замість select *. select * необхідні імена стовпців в зовнішньому запиті. Для частого використання запиту створення уявлення - це проста одноразова робота.

Альтернативно, в SQL * Plus ви можете використовувати команду NOPRINT. Він не відображає ім'я стовпця, яке ви не хочете відображати. Однак він буде працювати тільки в SQL * Plus.

Чи забезпечує він правильну розбивку на сторінки?

Так, якщо ви правильно пишете запит розбивки на сторінки.

Або, використовуйте нову функцію обмеження рядків на 12c, як я показав вище.

Тут мало хороших прикладів.

Відповідь на питання 2: В Oracle 12 ви можете використовувати розбивку на сторінки