2011-08-16 16 views
5

que busco para Oracle consulta de búsqueda en la red, y la mayoría de ellos me dijeron que envuelva la consulta dos veces:diferencia al usar ROWNUM

SELECT * 
    FROM (SELECT t.*, ROWNUM rn 
      FROM tableName t 
     WHERE ROWNUM < 200) 
WHERE rn > 100 

Sólo me preguntaba si puedo escribir como:

SELECT *, ROWNUM rn 
    FROM tableName t 
WHERE ROWNUN BETWEEN 100 AND 200 

Parece que el segundo funciona también. ¿Hay alguna diferencia (de rendimiento) entre estas dos consultas?

+1

Creo que probablemente haya obtenido la respuesta que necesita, pero me parece que las personas nuevas en Oracle a menudo tienen dificultades con las consultas de paginación, especialmente desde que mysql lo hace tan fácil con la palabra clave LIMIT. Yo diría que esta es una de las cosas más comunes que los principiantes de Oracle hacen mal, así que escribí un artículo sobre ello recientemente: http://betteratoracle.com/posts/18-limiting-query-results-top-n-and- consultas en la ventana –

Respuesta

4

El problema es que está filtrando en la misma consulta que se está generando el ROWNUM. De ahí la razón por la que debe tener una subconsulta genere el Rownum primero y luego aplique el filtrado. La razón por la cual BETWEEN funciona bien es probablemente algún matiz de cómo el motor procesa la consulta, pero me preocuparía que no siempre le proporcione los resultados correctos. Por lo tanto, no es una cuestión de rendimiento, ya que se trata de obtener resultados correctos.

En este artículo se explica por qué se tiene que poner el mayor que fuera de la subconsulta:. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns009.htm

SELECT * FROM employees 
    WHERE ROWNUM > 1; 

"La primera fila obtenida se le asigna un ROWNUM de 1 y hace que la condición falsa La segunda fila se pueda ahora se ha obtenido la primera fila y también se le ha asignado un ROWNUM de 1 y hace que la condición sea falsa. Todas las filas posteriormente no satisfacen la condición, por lo que no se devuelven las filas ".

4

La forma correcta de usar ROWNUM es:

SELECT x.* 
    FROM (SELECT t.*, 
       ROWNUM rn 
      FROM tableName t) AS x 
WHERE x.rn > 100 
    AND x.rn < 200 

BETWEEN es incluyente, por lo que las dos consultas no son idénticos lógica.

Para obtener más información sobre ROWNUM, vea this link (includes link to Oracle documentation.

+0

Gracias por su respuesta. Mi principal preocupación es que haya diferencias de rendimiento entre esas dos consultas en mis preguntas. ¿Puedes echar un vistazo al siguiente enlace: http://stackoverflow.com/questions/241622/paging-with-oracle Envuelve la consulta dos veces. – GaryX

+0

@GaryX: Como dije, las consultas proporcionadas no son idénticas; la segunda consulta devolverá todo en la tabla. El rendimiento es una preocupación hasta que obtenga datos válidos. –

+0

@OMG Ponies, ¿quiso decir: "El rendimiento no es una preocupación hasta que obtenga datos válidos"? –

Cuestiones relacionadas