2013-03-14 1 views
2

я знаю, объединение удаляет дубликаты, но он изменяет результирующий порядок, даже если нет никаких дубликатовTsql изменения союзного привести порядок, объединение всех не

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

Я хочу, чтобы союз их с или без него (все)

т.е. «Выберите союз (все) Выбрать B»

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

, если я использую «Выбрать союзной Select B», порядок результата отличается от просто «Выберите»

, если я использую «Выберите объединение всех Выберите B», порядок результата такой же, как Сам «Выбрать А»

и в «Выбрать А» нет дубликатов.

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

ответ

6

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

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


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

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

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

+0

спасибо. Мне нужно будет сделать заказ –

3

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

+0

спасибо. Я должен сделать заказ там –