SQL tricks
January 22, 2023

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