2012-09-18 14 views
5

Supongamos que queremos tomar el primer 1 registro de un conjunto de resultados. ¿Hay una forma más elegante de hacerlo?Oracle: una forma elegante de tomar el primer n registro (consulta top-k)

WITH temp 
     AS ( SELECT WKFC_CRONOLOGIA_ID 
       FROM SIUWKF.WKF_CRONOLOGIA c 
       WHERE  Ogg_oggetto_id = vOGG_ID 
        AND TOG_TIPO_OGGETTO_ID = vTOG 
        AND C.WKFC_DATA_FIN = TO_DATE ('31/12/9999', 'DD/MM/YYYY') 
        AND Wkfc_Tipo = 'STATO' 
      ORDER BY WKFC_DATA_INI DESC) 
    SELECT WKFC_CRONOLOGIA_ID 
    INTO vCRONOLOGIA_ID 
    FROM temp 
    WHERE ROWNUM = 1; 
+5

No creo que hay alguna otra manera elegante de hacerlo. Puede haber otras formas de hacerlo, pero de todos modos no necesariamente serán elegantes. – Annjawn

+0

¿Cuál es otra forma de formular la consulta top-k? – Revious

+1

¿Qué estás tratando de evitar con lo que tienes? o qué ...... sobre la consulta actual es "no elegante"? http://stackoverflow.com/questions/3451534/how-to-do-top-1-in-oracle –

Respuesta

1

Creo que su solución está bien. La única otra solución con Oracle es usar la función analítica row_number(), pero esto la hace menos elegante. Otras bases de datos tienen la declaración TOP 1 pero no hay otro equivalente de Oracle que ROWNUM fuera de una subconsulta cuando tiene un ORDER BY en uso. Acepto usar WITH que lo hace más legible. Lo siguiente podría escribirse más rápido, pero no estoy seguro de si es más elegante. Tal vez una cuestión de gusto:

SELECT * FROM 
( SELECT WKFC_CRONOLOGIA_ID 
       FROM SIUWKF.WKF_CRONOLOGIA c 
       WHERE  Ogg_oggetto_id = vOGG_ID 
        AND TOG_TIPO_OGGETTO_ID = vTOG 
        AND C.WKFC_DATA_FIN = TO_DATE ('31/12/9999', 'DD/MM/YYYY') 
        AND Wkfc_Tipo = 'STATO' 
      ORDER BY WKFC_DATA_INI DESC) 
WHERE ROWNUM = 1 

Esto es lo que el manual dice acerca de Oracle SQL ROWNUM y la parte superior-N de informes y confirma su camino en hacerlo.

enter image description here

Fuente Oracle de base de datos SQL Referencia del lenguaje 11g Release 2 (11.2) E26088-01

+0

¿Cómo podría reescribir usando la función analítica? – Revious

Cuestiones relacionadas