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

SQL Server UNION - то, что является поведением ORDER BY по умолчанию

Если у меня есть несколько утверждений UNION как надуманный пример:

SELECT * FROM xxx WHERE z = 1
UNION 
SELECT * FROM xxx WHERE z = 2
UNION
SELECT * FROM xxx WHERE z = 3

Что такое поведение по умолчанию order by?

Те данные, которые я вижу по существу, не возвращают данные в указанном выше порядке. То есть данные упорядочены, но я хотел знать, каковы правила приоритета на этом.

Другое дело, что в этом случае xxx представляет собой представление. Представление объединяет 3 разных таблицы вместе, чтобы вернуть результаты, которые я хочу.

4b9b3361

Ответ 1

Нет порядка по умолчанию.

Без предложения Заказ возвращенный заказ undefined. Это означает, что SQL Server может вернуть их в любом порядке, который ему нравится.

EDIT: Основываясь на том, что я видел, без ордера By, порядок возврата результатов зависит от плана запроса. Поэтому, если есть индекс, который он использует, результат может вернуться в этом порядке, но опять же нет гарантии.

Ответ 2

Что касается добавления предложения ORDER BY:

Это, наверное, элементарно для большинства здесь, но я думал, что добавляю это. Иногда вы не хотите, чтобы результаты были смешанными, поэтому вы хотите, чтобы первый результат запроса был вторым, и так далее. Для этого я просто добавляю фиктивный первый столбец и заказываю это. Из-за возможных проблем с тем, чтобы забыть псевдоним столбца в объединениях, я обычно использую ординалы в предложении order by, а не в именах столбцов.

Например:

SELECT 1, * FROM xxx WHERE z = 'abc'
UNION ALL
SELECT 2, * FROM xxx WHERE z = 'def'
UNION ALL
SELECT 3, * FROM xxx WHERE z = 'ghi'
ORDER BY 1

Столбцовый столбцовый столбец также полезен в моменты, когда я собираюсь запустить два запроса, и я знаю, что только один будет возвращать любые результаты. Затем я могу просто проверить порядковый номер возвращаемых результатов. Это избавляет меня от необходимости выполнять несколько вызовов базы данных и большинство пустых проверок результатов.

Ответ 3

Только что нашел фактический ответ.

Поскольку UNION удаляет дубликаты, он делает DISTINCT SORT. Это делается до того, как все операторы UNION будут объединены (проверьте план выполнения).

Чтобы остановить сортировку, выполните UNION ALL, и это также не приведет к удалению дубликатов.

Ответ 4

Если вам небезразличен, в каком порядке возвращаются записи, вы ДОЛЖНЫ использовать порядок.

Если вы оставите это, оно может отображаться организованным (на основе индексов, выбранных планом запроса), но результаты, которые вы видите сегодня, НЕ могут быть ожидаемыми вами результатами, и это может даже измениться при выполнении одного и того же запроса завтра.

Изменить: некоторые хорошие, конкретные примеры: (все примеры - сервер MS SQL)

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

    SELECT ContactID FROM Person.Contact
    SELECT *         FROM Person.Contact
    
  • Конор Каннингем показывает, как видимый порядок может измениться, когда таблица станет больше (если оптимизатор запросов решит использовать параллельное выполнение план).

  • Уго Корнелис доказывает, что кажущийся порядок не всегда основан на первичном ключе. Вот его последующее сообщение с объяснением.

Ответ 5

UNION может вводить в заблуждение относительно упорядочивания набора результатов, поскольку в базе данных иногда используется метод сортировки для предоставления DISTINCT, который подразумевается в UNION, что делает его похожим на то, что строки преднамеренно упорядочены - это не применяется для UNION ALL, для которого, конечно, не существует явных различий.

Однако существуют алгоритмы для неявных различий, таких как хэш-метод Oracle в 10g +, для которых не будет применяться порядок.

Как говорит DJ, всегда используйте ORDER BY

Ответ 6

Очень часто встречается плохо написанный код, который предполагает, что данные таблицы возвращаются в порядке вставки, и 95% времени, когда кодер уходит с ним и никогда не осознает, что это проблема, как во многих общих базах данных (MSSQL, Oracle, MySQL). Это, конечно, полная ошибка, и ее всегда следует исправлять, когда она сталкивается, и всегда без исключения использовать предложение Order By самостоятельно.

Ответ 7

Из моего практического опыта вы можете изменить порядок, используя "UNION" против "UNION ALL"... т.е. если ваш запрос похож на

Select Count(*) from Table A
UNION 
Select Count(*) from Table B

result is
10
26

вы можете отменить заказ, заменив "UNION" на "UNION ALL"... то результат будет

26
10