sql >> Base de Datos >  >> RDS >> Oracle

misterio de rownum en oraculo

ROWNUM es extraño porque puede evaluarse como parte de una condición en la consulta, pero si la fila no pasa ese filtro, el ROWNUM el valor que se le asignó vuelve a estar disponible para usarse nuevamente en la siguiente fila.

Un efecto importante de esto es que si usa cualquier condición que excluya un ROWNUM valor de 1, nunca obtendrá una coincidencia. La primera fila que se probará contra esta condición será la fila 1; pero luego fallará la prueba, por lo que la siguiente fila se considerará la fila 1; y así sucesivamente.

Entonces tu condición ROWNUM BETWEEN 2 AND 4 nunca puede ser verdad.

La solución que ha encontrado es la tradicional. Otra sería usar una función analítica para clasificar las filas y luego filtrar según la clasificación, por ejemplo:

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;

Se pueden usar varias funciones analíticas (RANK, DENSE_RANK y ROW_NUMBER) para este propósito y producirán resultados ligeramente diferentes, especialmente si hay empates. Consulte los documentos.