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

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

  • Тип: Дефект кода
  • Важность: Важный
  • Включена по умолчанию: Да
  • Теги: standard, sql, suspicious

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

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

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

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

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

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

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

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

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

Примеры

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

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

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

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

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

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

Источники

Соответствие стандартам

Источник диагностики