Подтвердить что ты не робот

Обеспечивает ли UNION ALL гарантию порядка набора результатов

Могу ли я быть уверенным, что результирующий набор из следующего script всегда будет отсортирован, как этот O-R-D-E-R?

SELECT 'O'
UNION ALL
SELECT 'R'
UNION ALL
SELECT 'D'
UNION ALL
SELECT 'E'
UNION ALL
SELECT 'R'

Можно ли иногда быть в другом порядке?

4b9b3361

Ответ 1

Нет встроенного порядка, вы должны использовать ORDER BY. Для вашего примера вы можете легко сделать это, добавив SortOrder к каждому SELECT. Затем он сохранит записи в том порядке, в котором вы хотите:

SELECT 'O', 1 SortOrder
UNION ALL
SELECT 'R', 2
UNION ALL
SELECT 'D', 3
UNION ALL
SELECT 'E', 4
UNION ALL
SELECT 'R', 5
ORDER BY SortOrder

Вы не можете гарантировать заказ, если вы специально не предоставите заказ по запросу.

Ответ 2

Нет, нет. Таблицы SQL по своей сути неупорядочены. Вы должны использовать order by, чтобы получить вещи в желаемом порядке.

Проблема заключается не в том, работает ли он один раз, когда вы его проверяете. Проблема в том, можете ли вы доверять этому поведению. И вы не можете. SQL Server даже не гарантирует порядок для этого:

select *
from (select t.*
      from t
      order by col1
     ) t

В нем говорится здесь:

Когда ORDER BY используется в определении представления, встроенной функции, производная таблица или подзапрос, предложение используется только для определения строки, возвращаемые предложением TOP. Предложение ORDER BY не гарантировать упорядоченные результаты, когда эти конструкции запрашиваются, если только ORDER BY также указывается в самом запросе.

Основным принципом языка SQL является то, что таблицы не упорядочены. Поэтому, хотя ваш запрос может работать во многих базах данных, вы должны использовать версию, предложенную BlueFeet, чтобы гарантировать упорядочение результатов.

Ответ 3

Попробуйте удалить все ALL s, например. Или даже один из них. Теперь рассмотрим, что тип оптимизации, который должен произойти там (и многие другие типы), также будет возможен, когда запросы SELECT являются актуальными запросами к таблицам и оптимизируются отдельно. Без ORDER BY упорядочение внутри каждого запроса будет произвольным, и вы не можете гарантировать, что сами запросы будут обрабатываться в любом порядке.

Высказывание UNION ALL без ORDER BY похоже на высказывание "Просто бросьте все мраморы на пол". Может быть, каждый раз, когда вы бросаете все мраморы на пол, они в конечном итоге организуются по цвету. Это не значит, что в следующий раз, когда вы бросите их на пол, они будут вести себя одинаково. То же самое верно для заказа в SQL Server - если вы не скажете ORDER BY, тогда SQL Server предполагает, что вам не нужен порядок. Вы можете видеть по совпадению, что определенный порядок возвращается все время, но многие вещи могут повлиять на произвольный порядок, который был выбран в следующий раз. Изменение данных, изменение статистики, перекомпилирование, обновление плана, обновление, пакет обновления, исправление, флаг трассировки... ad nauseum.

Я напишу это большими буквами, чтобы было ясно:

Вы не можете гарантировать заказ без ORDER BY

Дальнейшее чтение:

http://sqlblog.com/blogs/aaron_bertrand/archive/2010/02/08/bad-habits-to-kick-relying-on-undocumented-behavior.aspx

Кроме того, прочитайте этот пост Конор Каннингем, довольно умный парень из команды SQL.

Ответ 4

Нет. Вы получаете записи каким-либо образом SQL Server получает их за вас. Вы можете применить заказ в объединенном результирующем наборе с помощью индекса на основе 1:

SELECT 1, 'O'
UNION ALL
SELECT 2, 'R'
UNION ALL
SELECT 3, 'D'
UNION ALL
SELECT 4, 'E'
UNION ALL
SELECT 5, 'R'
ORDER BY 1