Oracle:获取前n个记录(top-k查询)的优雅方式

Rev*_*ous 5 sql oracle

假设我们想要获取结果集的前1条记录.有更优雅的方式吗?

   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;
Run Code Online (Sandbox Code Playgroud)

hol*_*hol 1

我认为你的解决方案没问题。Oracle 的唯一其他解决方案是使用row_number()分析函数,但这使其不太优雅。其他数据库也有该语句,但当您使用时,除了在子查询之外,TOP 1没有其他 Oracle 与它等效。我同意使用这使它更具可读性。下面可能会写得更快,但我不确定它是否更优雅。也许是品味问题:ROWNUMORDER BYWITH

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

这就是 Oracle SQL 手册中关于ROWNUMtop-N 报告的内容,并确认了您的做法。

\n\n

在此输入图像描述

\n\n

源 Oracle\xc2\xae 数据库\nSQL 语言参考\n11g 版本 2 (11.2)\nE26088-01

\n