#sql #oracle #oracle12c #sql-fetch
#sql #Oracle #oracle12c #sql-выборка
Вопрос:
У меня есть SQL-запрос Oracle, который используется 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
предложение ограничивает мои результаты до 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