bslls:SelectTopWithoutOrderBy¶
Использование 'ВЫБРАТЬ ПЕРВЫЕ' без 'УПОРЯДОЧИТЬ ПО' (SelectTopWithoutOrderBy)¶
- Тип: Дефект кода
- Важность: Важный
- Включена по умолчанию: Да
- Теги:
standard,sql,suspicious
Описание диагностики¶
Использование конструкции ПЕРВЫЕ N без указания порядка сортировки в УПОРЯДОЧИТЬ ПО или условий в секции ГДЕ чревато получением неожиданных результатов:
- В разных СУБД порядок возвращаемых результатов может отличаться
- Порядок в разных копиях ИБ будет отличаться от порядка, который ожидает разработчик
По стандарту, отсутствие предложения УПОРЯДОЧИТЬ ПО оправдано только в тех случаях, когда
- алгоритм обработки результатов запроса не рассчитывает на определенный порядок записей
- результат обработки выполненного запроса не показывается пользователю
- результат запроса - заведомо одна запись
В приведенных случаях рекомендуется не добавлять предложение УПОРЯДОЧИТЬ ПО в текст запроса, так как это приводит к дополнительным затратам времени при выполнении запроса.
Алгоритм работы диагностики¶
В процессе анализа считаются ошибочными конструкции:
- Использование
ПЕРВЫЕ Nв объединении вне зависимости от наличияУПОРЯДОЧИТЬ ПО, т.к. упорядочивание происходит уже после объединения - Использование
ПЕРВЫЕ N, гдеN > 1при отсутствииУПОРЯДОЧИТЬ ПО - Использование
ПЕРВЫЕ 1, при отсутствииУПОРЯДОЧИТЬ ПОи условий вГДЕ. Данное правило по умолчанию отключено параметром диагностики
Примеры¶
ВЫБРАТЬ ПЕРВЫЕ 1 // <-- Нет ошибка, есть условие
Справочник.Ссылка
ИЗ
Справочник.Контрагенты КАК Справочник
ГДЕ
Справочник.Ссылка В (
ВЫБРАТЬ ПЕРВЫЕ 10 // <-- Ошибка, нет сортировки
Ссылка
ИЗ
Справочник.Контрагенты)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ПЕРВЫЕ 10 // <-- Ошибка, нет сортировки (и не может быть)
Справочник.Ссылка
ИЗ
Справочник.Контрагенты КАК Справочник
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ПЕРВЫЕ 1 // <-- Всегда ошибка, даже 1
Справочник.Ссылка
ИЗ
Справочник.Контрагенты КАК Справочник
УПОРЯДОЧИТЬ ПО
Ссылка
Источники¶
Соответствие стандартам¶
- #std412, п. 1.1: Упорядочивание результатов запроса — Диагностика «Использование 'ВЫБРАТЬ ПЕРВЫЕ' без 'УПОРЯДОЧИТЬ ПО' (SelectTopWithoutOrderBy)» проверяет условие пункта 1.1 стандарта std412.
Источник диагностики¶
- Исходная статья
- Ревизия:
f4616cda8a216789ee40529ed857e614b9e2ea25 - Лицензия:
LGPL-3.0-or-later