У вас есть несколько проблем в том, что вы написали. Непосредственная проблема заключается в том, что вы получите ошибку из-за наличия order by
в первой ветви вашего союза, но простое удаление, которое вам не очень поможет.
Вы делаете (довольно часто ) ошибка с заказом и rownum
; глядя на первый подзапрос, который у вас есть:
select salary
from employees
where rownum<=10
order by salary desc
Фильтр rownum
будет применен до упорядочения, так что это фактически приведет к 10 неопределенным строкам из стол, который затем заказывается. Если я запускаю это, я получаю:
SALARY
----------
24000
13000
12000
10000
8300
6500
6000
4400
2600
2600
, но вы увидите разные значения, даже из одной и той же схемы примера. Если вы посмотрите на всю таблицу, вы увидите более высокие значения, чем те; и даже выполнение второго запроса покажет, что что-то не так, как вы ожидаете - для меня это выглядит так:
SALARY
----------
13000
4400
2600
2600
, которые не первые четыре строки из предыдущего запроса. (Опять же, вы увидите другие результаты, но, надеюсь, тот же эффект; если нет, посмотрите на всю таблицу, упорядоченную по зарплате.)
Вам необходимо упорядочить всю таблицу - в подзапросе - и затем отфильтровать :
select salary
from (
select salary
from employees
order by salary desc
)
where rownum<=10
, что дает гораздо более ощутимый и последовательный результат. Затем вы можете минус два запроса:
select salary
from (
select salary
from employees
order by salary desc
)
where rownum<=10
minus
select salary
from (
select salary
from employees
order by salary desc
)
where rownum<=4
order by salary desc;
SALARY
----------
13500
13000
12000
11500
Возможно, вы ожидаете увидеть там шесть значений, но есть три сотрудника с зарплатой 12000, а minus
устраняет дубликаты, поэтому сообщается только один раз. , Подход @ Мэтью (или @ Джеффа!) Даст вам все шесть, включая дубликаты, если вы этого хотите. Это также останавливает необходимость многократного попадания в таблицу.
Еще одна проблема связана со связями: если бы 4-й максимум был таким же, как 5-й, что бы вы ожидали? Использование minus
исключит это значение; Подход @ Мэтью сохранит его.
Вам нужно определить, что вы на самом деле хотите получить - 5–10-е самые высокие значения заработной платы? Зарплаты 5–10-го высокооплачиваемых людей (небольшая, но важная разница)? Вы действительно хотите только цифры или кто эти сотрудники? В таком случае, как вы справляетесь со связями, еще важнее? Et c. Как только вы знаете, что вам действительно нужно найти, вы можете решить, как лучше всего добиться этого результата.