Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

РЕДАКТИРОВАТЬ:Судя по тому, что я видел, без 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

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

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

Поскольку UNION удаляет дубликаты, он выполняет ОТЛИЧНУЮ СОРТИРОВКУ. Это делается до того, как все операторы UNION будут объединены (ознакомьтесь с планом выполнения).

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

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

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

Редактировать:Несколько хороших и конкретных примеров:(все примеры — сервер MS SQL)

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

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

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

UNION может быть обманчивым по отношению к порядку набора результатов, потому что база данных иногда использует метод сортировки для предоставления DISTINCT, который неявно присутствует в UNION, что делает его похожим на намеренно упорядоченные строки - это не применяется ОБЪЕДИНЯТЬ ВСЕХ, для которых, конечно, не существует явного и неявного различия.

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

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

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

Из моего практического опыта вы можете изменить порядок, используя " UNION " против "СОЮЗА ВСЕХ" ... т.е. если ваш запрос похож на

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

result is
10
26

вы можете изменить порядок, заменив " UNION " с "СОЮЗОМ ВСЕМ" ... тогда результат будет

26
10
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top