2015-07-17 3 views
4

Об использовании заказ ошибочными подзапросов брошено: .:почему заказ по ограничен в SQL подзапросов

например
set rowcount 10 
select * from XXX where Col1 in(
select Col2 from YYY 
order by Col3 desc 
) 

Хотел понять, почему этот тип запросов ограничены в SQL-сервер? ошибка брошена была:

Поручения п недействительна в представлениях, встроенных функциях, производных таблиц, подзапросов и общих табличных выражений, если TOP, не OFFSET или FOR XML также указан.

+3

В этом конкретном случае «порядок по» в подзапросе бессмысленен, так как вы хотите определить только «Col1» в этом подмножестве или нет - так зачем беспокоиться о порядке элементов подмножества? В более общем плане - можете ли вы предоставить какой-либо образец полезного «порядка» в упомянутых объектах базы данных? –

+0

В каком сценарии будет полезен топлесс ORDER BY в подзапросе?Только крайняя оговорка имеет значение –

+1

, как указано выше, в вашем случае не имеет значения порядок результатов в подзапросе. Независимо от того, упорядочены ли данные по возрастанию, по убыванию или в произвольном порядке, это не влияет на результаты во внешнем запросе. – Greg

ответ

6

ПОЧЕМУ?

Короткий ответ:

Поскольку комплекты не имеют порядка.

Longer Ответ:

SQL является реализацией реляционного исчисления, которое основано на tuple- Наборов (таблицы, наборы строки и т.д.). Наборы не имеют никакого заказа (в отличие от соответствующей концепции, Списки, которые являются наборами с заказом).

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

  • оптимизатор может добавить или удалить заказ на этапе выполнение запроса, так как он считает нужным, чтобы повысить производительность запроса,
  • Таким образом, это будет просто (значительная) дополнительная работа,
  • И оптимизатор может просто отменить это следующий шаг в любом случае
  • и запросы и этапы могут выполняться параллельно, так как opti mizer видит припадки, и это тоже, как правило, противоречит сохранению порядка.
  • Так применяя его раньше, не означает, что этот порядок еще будет там на более поздней стадии

Единственное место, которое оно обычно имеет смысл в конечной продукции, поскольку данные должны передаваться последовательно там так или иначе.

Единственные места, где это имеет смысл до Конечный результат для таких вещей, как TOP (N), которому нужен заказ, чтобы определить, какие строки являются «Верхними» строками.

Он также может иметь смысл для определенных функций агрегата, поэтому многие из них имеют свои собственные статьиORDER BY. Также для построения XML-результатов используются промежуточные этапы.

Смежные вопросы