sql - only - Oracle SELECT TOP 10 discos
select top oracle (6)
Tengo un gran problema con una declaración SQL en Oracle. Quiero seleccionar los 10 registros principales ordenados por STORAGE_DB que no están en una lista de otra declaración de selección.
Este funciona bien para todos los registros:
SELECT DISTINCT
APP_ID,
NAME,
STORAGE_GB,
HISTORY_CREATED,
TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') AS HISTORY_DATE
FROM HISTORY WHERE
STORAGE_GB IS NOT NULL AND
APP_ID NOT IN (SELECT APP_ID
FROM HISTORY
WHERE TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') = ''06.02.2009'')
Pero cuando estoy agregando
AND ROWNUM <= 10
ORDER BY STORAGE_GB DESC
Obtengo algún tipo de Registros "aleatorios". Creo que porque el límite toma lugar antes de la orden.
¿Alguien tiene una buena solución? El otro problema: esta consulta es realmente lenta (10k + registros)
Con respecto a los malos resultados, hay muchas cosas que podrían ser, y realmente debería ser una pregunta aparte. Sin embargo, hay una cosa obvia que podría ser un problema:
WHERE TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') = ''06.02.2009'')
Si HISTORY_DATE realmente es una columna de fecha y si tiene un índice, esta reescritura tendrá un mejor rendimiento:
WHERE HISTORY_DATE = TO_DATE (''06.02.2009'', ''DD.MM.YYYY'')
Esto se debe a que una conversión de tipo de datos deshabilita el uso de un índice B-Tree.
Deberá colocar su consulta actual en una subconsulta de la siguiente manera:
SELECT * FROM (
SELECT DISTINCT
APP_ID,
NAME,
STORAGE_GB,
HISTORY_CREATED,
TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') AS HISTORY_DATE
FROM HISTORY WHERE
STORAGE_GB IS NOT NULL AND
APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') =''06.02.2009'')
ORDER BY STORAGE_GB DESC )
WHERE ROWNUM <= 10
Oracle aplica rownum al resultado una vez que ha sido devuelto.
Debe filtrar el resultado después de que se haya devuelto, por lo que se requiere una subconsulta. También puede usar la función RANK() para obtener resultados Top-N.
Para el rendimiento intente usar NOT EXISTS
en lugar de NOT IN
. Vea this para más.
Obtiene un conjunto aparentemente aleatorio porque ROWNUM se aplica antes de ORDER BY. Por lo tanto, su consulta toma las primeras diez filas y las ordena.0 Para seleccionar los diez salarios principales, debe usar una función analítica en una subconsulta y luego filtrar eso:
select * from
(select empno,
ename,
sal,
row_number() over(order by sal desc nulls last) rnm
from emp)
where rnm<=10
Puedes simplemente usar TOP Clause
SELECCIONAR TOP 10 * FROM TABLE;
O
SELECCIONE column_name (s) FROM table_name WHERE ROWNUM <= number;
Si está utilizando Oracle 12c, puede usar:
buscar las siguientes N filas solamente
SELECT DISTINCT
APP_ID,
NAME,
STORAGE_GB,
HISTORY_CREATED,
TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') AS HISTORY_DATE
FROM HISTORY WHERE
STORAGE_GB IS NOT NULL AND
APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, ''DD.MM.YYYY'') =''06.02.2009'')
ORDER BY STORAGE_GB DESC
FETCH NEXT 10 ROWS ONLY
Más información: http://docs.oracle.com/javadb/10.5.3.0/ref/rrefsqljoffsetfetch.html
intente SELECCIONAR * DE los usuarios FETCH NEXT 10 ROWS ONLY;