2012-09-18 31 views
5

假設我們想要取結果集的前1條記錄。有沒有更好的方法來做到這一點?Oracle:採用第一條記錄的優雅方式(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

,我不認爲有任何其他優雅的方式來做到這一點。可能還有其他方法可以做到,但這些方式不一定會優雅。 – Annjawn

+0

哪一種方式來制定top-k查詢? – Revious

+1

你想用什麼來避免什麼?或者......關於當前的查詢是「不優雅」? http://stackoverflow.com/questions/3451534/how-to-do-top-top-1-in-oracle –

回答

1

我認爲你的解決方案是可以的。 Oracle的唯一其他解決方案是使用分析函數row_number(),但這使得它不夠優雅。其他數據庫具有TOP 1聲明,但當您使用ORDER BY時,在子查詢外部不存在與其等價的ROWNUM。我同意使用WITH,這使得它更具可讀性。以下可能會寫得更快,但我不確定它是否更優雅。也許品味的問題:

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 

這是甲骨文的SQL手冊說,大約ROWNUM和前N個報告,並確認在做它自己的方式。

enter image description here

來源的Oracle®數據庫 SQL語言參考 11g第2版(11.2) E26088-01

+0

你怎麼能重寫使用分析功能? – Revious