【发布时间】:2009-08-12 00:56:56
【问题描述】:
查询 1 = 从项目 i 中选择前 5 个 i.item_id
查询 2 = 从项目 i 中选择前 5 个 i.item_id、i.category_id
即使我删除了前 5 个子句,它们仍然返回不同的行。
如果我运行“从项目 i 中选择前 5 个 i.*”,这将返回一个完全不同的结果集!!
【问题讨论】:
标签: sql-server tsql top-n
查询 1 = 从项目 i 中选择前 5 个 i.item_id
查询 2 = 从项目 i 中选择前 5 个 i.item_id、i.category_id
即使我删除了前 5 个子句,它们仍然返回不同的行。
如果我运行“从项目 i 中选择前 5 个 i.*”,这将返回一个完全不同的结果集!!
【问题讨论】:
标签: sql-server tsql top-n
因为如果没有 ORDER BY 子句,“TOP N”限定 SELECT 的结果是不确定的。
【讨论】:
如果没有ORDER BY 子句,您将无法预测您将获得结果的顺序。 SQL Server 以不同方式处理这些查询可能有一个有趣的潜在原因,但从用户的角度来看,解决方案只是强加与您的查询相关的ORDER BY 子句,从而保证您将知道哪五个项目首先出现。
【讨论】:
由于您没有指定 ORDER BY 子句,优化器将确定执行您要求执行的查询的最有效方式。这意味着您在两个查询中指定的两列可能会执行不同的索引,这会导致您看到的结果。
【讨论】:
原因很简单:您没有指定 ORDER BY 子句。因此,例如,优化器可以选择使用不同的索引来满足两个不同的查询,如果有一个包含 ItemID 但不包含 CategoryID 的精简索引,它可以被触及以满足第一个查询。一个非常常见的问题,有一个罐头:
【讨论】: