Oracle WHERE Статья / Поиск - PullRequest
       0

Oracle WHERE Статья / Поиск

0 голосов
/ 06 сентября 2018

Я начинающий оракул. В недавнем поиске я видел WHERE N-1,3-2 ..so on.

Как это работает при поиске данных?

Это мой код пока что:

SELECT name, salary 
FROM #Employee e1
WHERE N-1 = (SELECT COUNT(DISTINCT salary) FROM #Employee e2
             WHERE e2.salary > e1.salary)

1 Ответ

0 голосов
/ 06 сентября 2018

Это классический (и довольно старый) SQL-запрос для получения nth самой высокой зарплаты.Я предполагаю, что он больше не используется (я не видел) ни в каких производственных кодах, но может быть любимым вопросом среди интервьюеров.

N, на который вы ссылаетесь, - это не столбец или некая неизвестная сущность, а заполнитель, который должен преобразовываться в действительный аргумент целого числа или связывания в рабочем запросе.Это коррелированный подзапрос , подзапрос, который оценивается один раз для каждой строки, обработанной внешним запросом.Как это работает, так это то, что он берет подсчет отдельных списков значений зарплаты от сотрудников, у которых зарплата больше, чем у каждого из сотрудников, поступающих из внешнего запроса, и ограничивает результат, когда это количество равно N-1. Что означает, что выполучить эти строки с n-й наивысшей зарплатой.

Более распространенный способ сделать это - использовать аналитическую функцию dense_rank() (или rank в зависимости от ваших потребностей).Прочтите документацию по этим функциям, если вы о них не знаете.

SELECT first_name,
       salary
FROM (
     SELECT e.*,
            dense_rank() OVER(
                 ORDER BY salary desc
            ) rn
     FROM employees e
)
WHERE rn = 6; -- ( n = 6 )

В Oracle 12c и более поздних версиях, хотя вышеуказанный запрос работает, удобной опцией для использования является синтаксис FETCH..FIRST.

SELECT *
FROM employees
ORDER BY salary DESC OFFSET 6 ROWS FETCH FIRST 1 ROWS WITH TIES; --n=6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...