Короткий ответ
LIMIT n (PostgreSQL, MySQL, ClickHouse, BigQuery) ставится после ORDER BY в конце запроса, TOP n в T-SQL (SQL Server) ставится сразу после SELECT, а FETCH FIRST n ROWS ONLY — стандартный ANSI SQL синтаксис, поддерживаемый, например, в PostgreSQL и Oracle как альтернатива LIMIT; при переносе запроса между диалектами синтаксис ограничения строк почти всегда нужно переписывать вручную.
Как это работает подробнее
все три конструкции решают одну задачу — ограничить количество возвращаемых строк — но различаются синтаксическим расположением и иногда поведением при наличии «ничьих» на границе отсечки (для которых может потребоваться WITH TIES в T-SQL или FETCH FIRST ... WITH TIES в ANSI SQL, что не всегда есть в упрощённом LIMIT).
Пример кода
question-71.sql
-- PostgreSQL / ClickHouse
SELECT * FROM orders ORDER BY amount DESC LIMIT 10;
-- T-SQL (SQL Server)
SELECT TOP 10 * FROM orders ORDER BY amount DESC;
-- ANSI SQL / Oracle / PostgreSQL
SELECT * FROM orders ORDER BY amount DESC FETCH FIRST 10 ROWS ONLY;Что использовать на практике
- Практика. при переносе SQL-логики между системами (например, миграция отчётов с SQL Server на PostgreSQL или с PostgreSQL на BigQuery) стоит явно пройтись по каждому запросу и заменить диалект-специфичный синтаксис, а не надеяться на автоматическую совместимость — в том числе проверить работу
OFFSET/пагинации, которая тоже оформляется по-разному. - Проверка. Проверка: все три варианта на одних и тех же данных должны вернуть одинаковый набор из 10 строк при отсутствии «ничьих» на границе.
Подводные камни
- Частая ошибка. копируют запрос с
TOP 10в PostgreSQL без изменений и получают синтаксическую ошибку; не замечают, что некоторые диалекты (например, старые версии MySQL) не поддерживаютOFFSETбезLIMITили требуют другого порядка аргументов (LIMIT offset, countв MySQL противLIMIT count OFFSET offsetв PostgreSQL).