Вопрос:

Tsql, union меняет порядок результата, union все не

tsql sql-order-by union union-all

3038 просмотра

2 ответа

178 Репутация автора

Я знаю, UNIONудаляет дубликаты, но это меняет порядок результатов, даже если нет дубликатов.

У меня есть два выбора операторов, ни одного заказа по заявлению в любом месте

Я хочу объединить их с или без (все)

т.е.

SELECT A 
UNION (all) 
SELECT B

«Выберите B» на самом деле ничего не содержит, запись не будет возвращена

если я использую «Select A union Select B», порядок результата отличается от просто «Select A»

если я использую:

SELECT A 
UNION ALL 
SELECT B

порядок результата такой же, как и у самого «Выбрать А», и в «Выбрать А» нет дубликатов.

Почему это? это непредсказуемо.

Автор: Li Tian Gong Источник Размещён: 14.03.2013 06:48

Ответы (2)


7 плюса

200909 Репутация автора

Решение

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

Поэтому, если вы хотите / нуждаетесь в определенном заказе, используйте ORDER BY.


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

Один из простых и простых способов определить, есть ли у вас дубликаты в сумке результатов, - отсортировать эти результаты (в любом порядке сортировки, наиболее удобном для системы) - таким образом, дубликаты оказываются рядом друг с другом, и вы можете затем просто перебрать эти отсортированные результаты и if(results[index] == results[index-1]) skip;.

Итак, вы обычно обнаружите, что результаты UNION(без ALL) запроса были отсортированы в произвольном порядке. Но, чтобы еще раз подчеркнуть исходную точку, то, что порядок был применен, не определено, и, конечно, на него не следует полагаться - любые исправления программного обеспечения, изменения в индексах или статистике могут привести к тому, что система выберет другой порядок сортировки в следующем время выполнения запроса - если нет ORDER BYпредложения.

Автор: Damien_The_Unbeliever Размещён: 14.03.2013 07:15

3 плюса

8767 Репутация автора

Одним из наиболее важных моментов, которые следует понимать в SQL, является то, что таблица не имеет гарантированного порядка, поскольку таблица должна представлять набор (или мультимножество, если в нем есть дубликаты), а набор не имеет порядка. Это означает, что при запросе таблицы без указания предложения ORDER BY запрос возвращает результат таблицы, и SQL Server может свободно возвращать строки в выводе в любом порядке . Если результаты оказываются упорядоченными, это может быть связано с оптимизацией. Я пытаюсь подчеркнуть, что любой порядок строк в выводе считается действительным, и конкретный порядок не гарантируется. Единственный способ гарантировать, что строки в результате будут отсортированы, - это явно указать предложение ORDER BY.

Автор: Bill Размещён: 14.03.2013 07:15
Вопросы из категории :
32x32