SQL Server:为什么这些查询会返回不同的结果集?

时间:2009-08-11 16:52:22

标签: sql-server tsql top-n

查询1 =从ITEMS i中选择前5名i.item_id

查询2 =从ITEMS i中选择前5名i.item_id,i.category_id

即使我删除了前5个子句,它们仍会返回不同的行。

如果我运行“从ITEMS i中选择前5名i。*”,则返回完全不同的结果集!!

4 个答案:

答案 0 :(得分:7)

因为如果你没有ORDER BY子句,“TOP N”限定SELECT的结果是不确定的。

答案 1 :(得分:3)

如果没有ORDER BY子句,您将无法预测获得结果的顺序。可能有一个有趣的潜在原因导致SQL Server以不同方式处理这些查询,但从用户的角度来看,解决方案只是强加与您的查询相关的ORDER BY子句,从而保证您将知道哪五个项目来自第一

答案 2 :(得分:3)

由于您没有指定ORDER BY子句,优化器将确定执行您要求执行的查询的最有效方法。这意味着您在两个查询中指定的两列可能会有不同的索引,这会导致您看到的内容。

答案 3 :(得分:2)

原因很简单:您没有指定ORDER BY子句。因此,例如,优化器可以选择使用不同的索引来满足两个不同的查询,如果存在包含ItemID而不是CategoryID的精简索引,则可以触摸它以满足第一个查询。一个非常常见的问题,有一个罐头鼻子:

Without ORDER BY, there is no default sort order.