【问题标题】:SQL Server: Why do these queries return different result sets?SQL Server:为什么这些查询返回不同的结果集?
【发布时间】: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】:

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

    【讨论】:

    • 严格来说,任何没有 ORDER BY 的 SELECT 的结果都是不确定的。 TOP 只是将 n 行限制为 5 行,因此不是所有行都按任何顺序排列,而是 5 个不同的行。
    • 嘿。好吧,严格地只有它们的顺序通常是不确定的(在 SQL 技术上,如果没有 ORDER BY,它在技术上是不存在的)。但是,对于 TOP,实际的 内容 在没有 ORDER BY 的情况下是不确定的。
    • 我们都是对的......但 TOP 是不确定排序的结果 ;-) 我仍然给你 +1 作为第一个答案
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 虽然其他基于语言本身是正确的,但这对于 SQL Server 来说是正确的。如果您调查 Estimated Execution Plan,您可能会看到使用了许多不同的指标。但是,我的直觉告诉我有问题的表没有索引。
      【解决方案4】:

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

      Without ORDER BY, there is no default sort order.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多