1

查询 1 = 从项目 i 中选择前 5 个 i.item_id

查询 2 = 从项目 i 中选择前 5 个 i.item_id、i.category_id

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

如果我运行“从项目 i 中选择前 5 个 i.*”,这将返回一个完全不同的结果集!

4

4 回答 4

7

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

于 2009-08-11T16:54:39.823 回答
3

没有ORDER BY子句,你无法预测你会得到什么结果。SQL Server 以不同方式处理这些查询可能有一个有趣的潜在原因,但从用户的角度来看,解决方案只是强加与ORDER BY您的查询相关的子句,从而保证您将知道哪五个项目首先出现。

于 2009-08-11T16:55:37.620 回答
3

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

于 2009-08-11T16:56:06.137 回答
2

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

没有 ORDER BY,就没有默认的排序顺序。

于 2009-08-11T16:55:55.250 回答