Использование 'ВЫБРАТЬ ПЕРВЫЕ' без 'УПОРЯДОЧИТЬ ПО' (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
}