FETCH FIRST … ROWS WITH TIES
В этой статье я хочу представить новое решение распространенной задачи: поиск в таблице записей с максимальным значением в одной из колонок. Например, мы будем искать сотрудников с максимальной зарплатой.
На первый взгляд, задача кажется решаемой с помощью сортировки (ORDER BY salary DESC)
и ограничения (LIMIT 1)
. Однако это решение неверно, так как оно возвращает только одну запись. А что, если у нас несколько сотрудников с одинаковой максимальной зарплатой?
Стандартное решение заключается в поиске максимального значения в столбце зарплаты (salary)
, а затем использовании этого значения в качестве фильтра.
select * from employees where salary = (select max(salary) from employees);
Однако стандарт SQL:2008 предлагает новое решение данной задачи: FETCH FIRST … ROWS WITH TIES
select * from employees order by salary desc fetch first 1 rows with ties;
Использование конструкции FETCH FIRST ... ROWS WITH TIES позволяет легко решить задачу поиска N максимальных или минимальных значений, что другими способами не всегда так просто.
На данный момент этот синтаксис поддерживается в MariaDB 10, PostgreSQL начиная с версии 13 и Oracle DB.
В Microsoft SQL Server применяется похожая собственная конструкция:
select top 1 with ties * from employees order by salary desc;
Вы можете легко проверить эти запросы и попробовать собственные варианты на SQLize.online