Oracle
 sql >> база данни >  >> RDS >> Oracle

Мистерията на rownum в Oracle

ROWNUM е странен, тъй като може да бъде оценен като част от условие в заявката - но ако след това редът не успее да премине този филтър, ROWNUM стойността, която му е присвоена, става достъпна за използване отново за следващия ред.

Един важен ефект от това е, че ако използвате условие, което изключва ROWNUM стойност 1, никога няма да получите съвпадение. Първият ред, който ще бъде тестван спрямо това условие, ще бъде ред 1; но след това ще се провали на теста, така че следващият ред ще се счита за ред 1; и така нататък.

Така че вашето условие ROWNUM BETWEEN 2 AND 4 никога не може да бъде истина.

Заобиколното решение, което сте намерили, е традиционното. Друго би било да използвате аналитична функция за класиране на редовете, след което да филтрирате по ранга, напр.:

SELECT MI.* FROM (
  SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank
  FROM ELEC_AUTO_MERC 
  ) MI
WHERE the_rank BETWEEN 2 AND 4;

Няколко аналитични функции - RANK, DENSE_RANK и ROW_NUMBER - могат да се използват за тази цел и ще дадат малко по-различни резултати, особено ако има равенства. Вижте документите.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво е точното значение на наличието на условие като where 0=0?

  2. Как да заредя JAR файл в базата данни на Oracle?

  3. надвишен е максималният брой рекурсивни SQL нива (50).

  4. Не може да се намери Oracle jdbc драйвер

  5. Как да получите работни дни или часове между две дати