2012-09-18 17 views
5

Supponiamo di voler prendere il primo record di un set di risultati. C'è un modo più elegante per farlo?Oracle: un modo elegante per prendere il primo record n ​​(query 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

Non credo ci sia altro modo elegante per farlo. Ci possono essere altri modi per farlo, ma quelli non necessariamente saranno comunque eleganti. – Annjawn

+0

Quali sono altri modi per formulare la query top-k? – Revious

+1

cosa stai cercando di evitare con quello che hai? o cosa ...... della domanda corrente è "non elegante"? http://stackoverflow.com/questions/3451534/how-to-do-top-1-in-oracle –

risposta

1

Penso che la soluzione sia a posto. L'unica altra soluzione con Oracle è quella di utilizzare la funzione analitica row_number() ma ciò lo rende meno elegante. Altri database hanno l'istruzione TOP 1 ma non esiste altro Oracle equivalente ad esso di ROWNUM all'esterno di una sottoquery quando si utilizza uno ORDER BY in uso. Accetto di utilizzare WITH che lo rende più leggibile. Quanto segue potrebbe essere scritto più velocemente, ma non sono sicuro che sia più elegante. Forse una questione di 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 

Questo è ciò che il manuale Oracle SQL dice a proposito ROWNUM e reporting top-N e conferma la tua strada nel farlo.

enter image description here

Fonte Oracle® Database SQL di riferimento di 11g Release 2 (11.2) E26088-01

+0

Come potresti riscrivere utilizzando la funzione analitica? – Revious

Problemi correlati