2009-08-11 2 views
1

Запрос 1 = выбрать лучшие 5 i.item_id из ДЕТАЛЕЙ яSQL Server: Почему эти запросы возвращают разные результирующие наборы?

Запрос 2 = выбрать лучшие 5 i.item_id, i.category_id из ДЕТАЛЕЙ я

Даже если я удалить верхний 5 пункт они по-прежнему возвращать разные строк.

если я запустил «select top 5 i. * From ITEMS i», это возвращает совершенно другой набор результатов !!

ответ

7

Поскольку результаты квалифицированного SELECT «TOP N» являются неопределенными, если у вас нет предложения ORDER BY.

+0

Строго, результаты любого SELECT без ORDER BY являются неопределенными. TOP ограничивает n строк на 5 строк, поэтому вместо всех строк в любом порядке вы получаете 5 разных. – gbn

+0

Хех. Ну * строго * только их порядок обычно неопределен (что в SQL технически не существует без ORDER BY). Однако, с TOP, фактическое * содержимое * неопределенно без ORDER BY. – RBarryYoung

+1

Мы оба правы ... но TOP является следствием неопределенного упорядочения ;-) Я до сих пор дал вам + 1 для первого ответа – gbn

3

Без оговорки ORDER BY вы не можете предсказать, какой заказ вы получите. Вероятно, есть интересная причина, по которой SQL Server обрабатывает эти запросы по-разному, но с точки зрения пользователя решение просто навязывает предложение ORDER BY, соответствующее вашему запросу, гарантируя, что вы узнаете, какие пять пунктов будут первыми.

2

Причина проста: вы не указали предложение ORDER BY. Так, например, оптимизатор может выбрать использование разных индексов для удовлетворения двух разных запросов, если есть индексированный индекс, который содержит ItemID, но не CategoryID, его можно коснуться, чтобы удовлетворить первый запрос. Очень распространенный вопрос, имеет консервированную naswer:

Without ORDER BY, there is no default sort order.

3

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

+0

Хотя другие правильные основаны на самом языке, это место для SQL Server. Если вы исследуете Оценочный план выполнения, вы, вероятно, увидите много разных используемых индексов. Тем не менее, моя кишка говорит мне, что у данной таблицы нет индекса. –

+0

+1 от меня, кстати. –