在 Oracle SQL 中使用“Fetch First”后如何对行进行排序?

Posted

技术标签:

【中文标题】在 Oracle SQL 中使用“Fetch First”后如何对行进行排序?【英文标题】:How do I order rows after using "Fetch First" in Oracle SQL? 【发布时间】:2020-11-24 18:30:05 【问题描述】:

我有一个 Oracle SQL 查询,它使用 FETCH FIRST 在 PeopleSoft 数据库中查找年薪最高的员工。

SELECT A.EMPLID, A.ANNUAL_RT
FROM PS_EMPLOYEES A
ORDER BY A.ANNUAL_RT DESC
FETCH FIRST ROW WITH TIES;
EMPLID   ANNUAL_RT
20218    100000
10300    100000
26992    100000
17864    100000

我想按 EMPLID 对结果进行排序。但是,由于我使用的是FETCH FIRST 1 ROW WITH TIES,因此将EMPLID 添加到我的ORDER BY 子句会将我的结果限制为ID 号​​最低的1 位员工。

SELECT A.EMPLID, A.ANNUAL_RT
FROM PS_EMPLOYEES A
ORDER BY A.ANNUAL_RT DESC, A.EMPLID ASC
FETCH FIRST 1 ROW WITH TIES;
EMPLID   ANNUAL_RT
10300    100000

我怎样才能对我的结果进行排序而不影响FETCH FIRST返回的行?

EMPLID   ANNUAL_RT
10300    100000
17864    100000
20218    100000
26992    100000

【问题讨论】:

【参考方案1】:

将您的查询作为一个表表达式括起来(一个通用的表表达式也可以)。这样您就可以对其进行后期处理。

例如:

select *
from (
  SELECT A.EMPLID, A.ANNUAL_RT
  FROM PS_EMPLOYEES A
  ORDER BY A.ANNUAL_RT DESC
  FETCH FIRST 1 ROW WITH TIES
) x
order by emplid;

【讨论】:

【参考方案2】:

您可以使用RANK()DENSE_RANK() 代替FETCH FIRST

SELECT EMPLID, ANNUAL_RT
FROM (
  SELECT
    A.EMPLID,
    A.ANNUAL_RT,
    RANK() OVER (ORDER BY A.ANNUAL_RT DESC) AS RANK_NO
  FROM PS_EMPLOYEES A
)
WHERE RANK_NO = 1
ORDER BY EMPLID;

结果:

EMPLID   ANNUAL_RT
10300    100000
17864    100000
20218    100000
26992    100000

【讨论】:

以上是关于在 Oracle SQL 中使用“Fetch First”后如何对行进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

oracle触发器中定时执行sql

SQL SERVER和ORACLE中SQL语句一样吗?

Oracle 12c - 在 REST 调用中使用动态 SQL

SQL 在 SQL Server 和 Oracle 中返回固定数据

ORACLE LEFT JOIN 子查询 在SQL SERVER中可以使用如图中的子查询,ORACLE中怎么实现

在 oracle 中使用正则表达式查找 POBOX - PL/SQL