查询1 =从ITEMS i中选择前5名i.item_id
查询2 =从ITEMS i中选择前5名i.item_id,i.category_id
即使我删除了前5个子句,它们仍会返回不同的行。
如果我运行“从ITEMS i中选择前5名i。*”,则返回完全不同的结果集!!
答案 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的精简索引,则可以触摸它以满足第一个查询。一个非常常见的问题,有一个罐头鼻子: