Pregunta

Por lo general, necesito recuperar datos de una tabla en algún rango; por ejemplo, una página separada para cada resultado de búsqueda. En MySQL uso la palabra clave LIMIT pero en DB2 no lo sé. Ahora uso esta consulta para recuperar el rango de datos.

SELECT * 
FROM(
   SELECT  
      SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO
      , DATA_KEY_VALUE
      , SHOW_PRIORITY
   FROM 
      EMPLOYEE
   WHERE 
      NAME LIKE 'DEL%'
   ORDER BY
      NAME DESC
   FETCH FIRST 20 ROWS ONLY
) AS TMP
ORDER BY 
  TMP.RUNNING_NO ASC
FETCH FIRST 10 ROWS ONLY

pero sé que es mal estilo. Entonces, ¿cómo consultar el rendimiento más alto?

¿Fue útil?

Solución

Mi requisito ya se ha agregado a DB2 9.7.2.

DB2 9.7.2 agrega una nueva sintaxis para el resultado de la consulta de límite como se ilustra a continuación:

SELECT * FROM TABLE LIMIT 5 OFFSET 20

la base de datos recuperará el resultado de la fila no. 21 - 25

Otros consejos

No estoy seguro de por qué está creando la tabla TMP. ¿No está RUNNING_NO listo en secuencia ascendente? Yo pensaría:

SELECT SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO,
       DATA_KEY_VALUE,
       SHOW_PRIORITY
  FROM EMPLOYEE
 WHERE NAME LIKE 'DEL%'
 ORDER BY NAME DESC
 FETCH FIRST 10 ROWS ONLY

daría los mismos resultados.

Tener un ÍNDICE sobre NOMBRE en la tabla EMPLEADO aumentará el rendimiento de esta consulta.

Es muy difícil, depende de la base de datos que tenga.

por ejemplo:

SELECT * FROM ( 
    SELECT 
      ROW_NUMBER() OVER (ORDER BY ID_USER ASC) AS ROWNUM,  
      ID_EMPLOYEE, FIRSTNAME, LASTNAME 
    FROM EMPLOYEE 
    WHERE FIRSTNAME LIKE 'DEL%' 
  )  AS A WHERE A.rownum
BETWEEN 1 AND 25
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top