Выборка данных для rownum = 1, но не для других, чем 1 в Oracle SQL - PullRequest
0 голосов
/ 15 февраля 2019

Получение результата (rownum = 1):

SELECT rownum,
       A.loadplan_name
FROM   (SELECT loadplan_name,
               run_date
        FROM   dcbp13_bia_odirepo.citizen_odi_required_loadplans
        WHERE  run_date LIKE '13-FEB-19'
        ORDER  BY run_date DESC,
                  loadplan_name ASC) A
WHERE  rownum = 1

Не получение результата (rownum ≠ 1):

SELECT rownum,
       A.loadplan_name
FROM   (SELECT loadplan_name,
               run_date
        FROM   dcbp13_bia_odirepo.citizen_odi_required_loadplans
        WHERE  run_date LIKE '13-FEB-19'
        ORDER  BY run_date DESC,
                  loadplan_name ASC) A
WHERE  rownum = 2  

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы совсем близко.Как говорит doco, операции со значениями ROWNUM, превышающими положительное целое число, всегда ложны.Вы можете использовать меньше чем, равно вместо больше чем.Итак, этот запрос в порядке:

SELECT rownum,
       A.loadplan_name
FROM   (SELECT loadplan_name,
               run_date
        FROM   dcbp13_bia_odirepo.citizen_odi_required_loadplans
        WHERE  run_date LIKE '13-FEB-19'
        ORDER  BY run_date DESC,
                  loadplan_name ASC) A
WHERE  rownum < 2;

SELECT rownum,
       A.loadplan_name
FROM   (SELECT loadplan_name,
               run_date
        FROM   dcbp13_bia_odirepo.citizen_odi_required_loadplans
        WHERE  run_date LIKE '13-FEB-19'
        ORDER  BY run_date DESC,
                  loadplan_name ASC) A
WHERE  rownum = 2;

, но не этот:

SELECT rownum,
       A.loadplan_name
FROM   (SELECT loadplan_name,
               run_date
        FROM   dcbp13_bia_odirepo.citizen_odi_required_loadplans
        WHERE  run_date LIKE '13-FEB-19'
        ORDER  BY run_date DESC,
                  loadplan_name ASC) A
WHERE  rownum > 1;
0 голосов
/ 15 февраля 2019

Это объясняется в документации .rownum рассчитывается, когда возвращается набор результатов.Таким образом, он увеличивается только при добавлении новых строк в набор результатов.

Следовательно, он никогда не принимает значение "2", не имея значения "1".

Как объяснено:

Условия проверки значений ROWNUM, превышающих положительное целое число, всегда ложны.Например, этот запрос не возвращает строк:

SELECT *
FROM employees
WHERE ROWNUM > 1;

Первой извлеченной строке присваивается ROWNUM, равный 1, и условие становится ложным.Вторая извлекаемая строка теперь является первой строкой, ей также присваивается ROWNUM, равный 1, и условие становится ложным.Впоследствии все строки не удовлетворяют условию, поэтому строки не возвращаются.

Решение обычно выглядит примерно так:

SELECT rn, A.LOADPLAN_NAME
FROM (SELECT LOADPLAN_NAME, RUN_DATE, rownum as rn
      FROM DCBP13_BIA_ODIREPO.CITIZEN_ODI_REQUIRED_LOADPLANS      
      WHERE RUN_DATE like '13-FEB-19'
      ORDER BY RUN_DATE DESC, LOADPLAN_NAME ASC
     ) A  
WHERE rn = 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...