Перейти к содержанию

Использование 'ВЫБРАТЬ ПЕРВЫЕ' без 'УПОРЯДОЧИТЬ ПО' (SelectTopWithoutOrderBy)

Тип Поддерживаются
языки
Важность Включена
по умолчанию
Время на
исправление (мин)
Теги
Дефект кода BSL Важный Да 5 standard
sql
suspicious

Параметры

Имя Тип Описание Значение
по умолчанию
skipSelectTopOne Булево Пропускать 'ВЫБРАТЬ ПЕРВЫЕ 1' при наличии отбора true

Описание диагностики

Использование конструкции ПЕРВЫЕ N без указания порядка сортировки в УПОРЯДОЧИТЬ ПО или условий в секции ГДЕ чревато получением неожиданных результатов:

  • В разных СУБД порядок возвращаемых результатов может отличаться
  • Порядок в разных копиях ИБ будет отличаться от порядка, который ожидает разработчик

По стандарту, отсутствие предложения УПОРЯДОЧИТЬ ПО оправдано только в тех случаях, когда

  • алгоритм обработки результатов запроса не рассчитывает на определенный порядок записей
  • результат обработки выполненного запроса не показывается пользователю
  • результат запроса - заведомо одна запись

В приведенных случаях рекомендуется не добавлять предложение УПОРЯДОЧИТЬ ПО в текст запроса, так как это приводит к дополнительным затратам времени при выполнении запроса.

Алгоритм работы диагностики

В процессе анализа считаются ошибочными конструкции:

  • Использование ПЕРВЫЕ N в объединении вне зависимости от наличия УПОРЯДОЧИТЬ ПО, т.к. упорядочивание происходит уже после объединения
  • Использование ПЕРВЫЕ N, где N > 1 при отсутствии УПОРЯДОЧИТЬ ПО
  • Использование ПЕРВЫЕ 1, при отсутствии УПОРЯДОЧИТЬ ПО и условий в ГДЕ. Данное правило по умолчанию отключено параметром диагностики

Примеры

ВЫБРАТЬ ПЕРВЫЕ 1                            // <-- Нет ошибка, есть условие
   Справочник.Ссылка
ИЗ
   Справочник.Контрагенты КАК Справочник
ГДЕ
   Справочник.Ссылка В (
       ВЫБРАТЬ ПЕРВЫЕ 10                   // <-- Ошибка, нет сортировки
           Ссылка
       ИЗ
           Справочник.Контрагенты)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ПЕРВЫЕ 10                          // <-- Ошибка, нет сортировки (и не может быть)
   Справочник.Ссылка
ИЗ
   Справочник.Контрагенты КАК Справочник

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ПЕРВЫЕ 1                          // <-- Всегда ошибка, даже 1
   Справочник.Ссылка
ИЗ
   Справочник.Контрагенты КАК Справочник

УПОРЯДОЧИТЬ ПО
   Ссылка

Источники

Сниппеты

Экранирование кода

// BSLLS:SelectTopWithoutOrderBy-off
// BSLLS:SelectTopWithoutOrderBy-on

Параметр конфигурационного файла

"SelectTopWithoutOrderBy": {
    "skipSelectTopOne": true
}