Упорядочивание результатов запроса

#std412

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

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

Типичные примеры проблем, которые могут возникать (даже при работе на одной и той же СУБД в непредсказуемые моменты времени):

Вероятность возникновения разных результатов при выполнении одинаковых действий повышается 

* Примечание: упорядочивание результатов запросов, по которым формируются движения, оправдано только в том случае, если упорядочивание является частью алгоритма формирования движений (например, списание остатков партий товаров по FIFO). В остальных случаях упорядочивать записи не следует, так как дополнительное упорядочивание будет создавать избыточную нагрузку на СУБД.

1.2. При сортировке по полю запроса, которое может потенциально содержать NULL, следует учитывать, что в разных СУБД порядок сортировки по этому полю может отличаться.

Неправильно:

ВЫБРАТЬ
  СправочникНоменклатура.Ссылка КАК НоменклатураСсылка,
  ЗапасыОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
  Справочник.Номенклатура КАК СправочникНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки КАК ЗапасыОстатки
    ПО (ЗапасыОстатки.Номенклатура = СправочникНоменклатура.Ссылка)

УПОРЯДОЧИТЬ ПО
  КоличествоОстаток

Правильно:

ВЫБРАТЬ
  СправочникНоменклатура.Ссылка КАК НоменклатураСсылка,
  ЕСТЬNULL(ЗапасыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
ИЗ
  Справочник.Номенклатура КАК СправочникНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки КАК ЗапасыОстатки
    ПО (ЗапасыОстатки.Номенклатура = СправочникНоменклатура.Ссылка)

УПОРЯДОЧИТЬ ПО
  КоличествоОстаток

См. также: Особенности работы с различными СУБД

1.3. Если результаты запроса должны тем или иным образом отображаться пользователю, то

В противном случае порядок следования строк будет выглядеть для пользователя случайным (необъяснимым).

См. также: Особенности сортировки в таблице значений

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

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

Совместное использование с конструкцией РАЗЛИЧНЫЕ

2. Если в запросе используется конструкция РАЗЛИЧНЫЕ, упорядочивание следует выполнять только по полям, включенным в выборку (в секции ВЫБРАТЬ). 

Данное требование связано со следующей особенностью выполнения запросов: в поля выборки неявно включаются поля упорядочивания, что в свою очередь может привести к появлению в результате запроса нескольких строк с одинаковыми значениями полей выборки. 

Ограничения на использование конструкции АВТОУПОРЯДОЧИВАНИЕ

3. Использование конструкции ПЕРВЫЕ совместно с конструкцией АВТОУПОРЯДОЧИВАНИЕ запрещено.

В остальных случаях конструкцию АВТОУПОРЯДОЧИВАНИЕ также не рекомендуется использовать, так как разработчик не контролирует, какие именно поля будут использованы для упорядочивания. Применение такой конструкции оправдано только в тех случаях, когда получаемый порядок записей не важен, но при этом он должен быть одинаковым в не зависимости от применяемой СУБД. 

Причины использования конструкции АВТОУПОРЯДОЧИВАНИЕ следует указывать в комментарии, размещенном непосредственно перед текстом запроса.