首页 > 解决方案 > 为什么在空列上使用 ORDER BY 的 TOP 1 结果集显示与 TOP 5 不同的结果?

问题描述

当查询 SQL Server 表并在仅填充有 '' 的列上排序时,与 TOP 5 相比,TOP 1 得到不同的结果。似乎第一条记录被忽略,然后返回请求的记录数 -以相反的顺序。

-- Drop temp table if it exists
DROP TABLE IF EXISTS [tempdb]..[#OrderByTest];

-- Create temp table
CREATE TABLE [#OrderByTest]
(
    TestValue VARCHAR(1),
    TestName  VARCHAR(20)
 );

-- Populate temp table
INSERT INTO [#OrderByTest] (TestValue, TestName) VALUES
            ('', 'Bravo'),
            ('', 'Foxtrot'),
            ('', 'Charlie'),
            ('', 'Alpha'),
            ('', 'Delta'),
            ('', 'Echo'),
            ('', 'Golf'),
            ('', 'Hotel'),
            ('', 'Indigo'),
            ('', 'Juliet');

--SELECT * FROM #OrderByTest;

-- Query table for TOP 1 and ORDER BY
SELECT TOP 1 TestName FROM #OrderByTest ORDER BY TestValue;

-- Query table for TOP 5 and ORDER BY
SELECT TOP 5 TestName FROM #OrderByTest ORDER BY TestValue;

我更希望 TOP 1 回归 Bravo,因为它是输入的第一条记录。我还预计 TOP 5 会返回 Bravo,其次是 Foxtrot、Charlie、Alpha 和 Delta,因为这是添加记录的顺序。

我得到的 TOP 1 总是 Foxtrot,而 TOP 5 我得到的是 Echo、Delta、Alpha、Charlie 和 Foxtrot。似乎 TOP 5 语句忽略了第一条记录,然后反转了接下来的 5 条记录。

如果我将 TOP 5 更改为 TOP 3,那么这个观察结果是正确的,因为我得到了 Alpha、Charlie、Foxtrot。

关于发生了什么的任何想法?

标签: tsql

解决方案


这是 SQL Server 在未指定显式排序时确定自己的记录排序的典型示例。从排序的角度来看,这也适用于所有似乎“相等”的记录。(在这种情况下:所有记录。)

所以你确实指定了一个顺序,但它没有逻辑效果,因为根据你指定的顺序,所有记录都是“相等的”。所以最后 SQL Server 自己确定排序。

为什么它与根本没有排序的查询不同?或者与使用 TOP 等相关功能但具有其他参数值的查询不同?只有微软的工程师可能知道。这可能与复杂的 SQL Server 引擎的内部实现有关。

严格来说,这根本不重要。否则,无论如何您都会提供有效的订购。;) 出于性能原因:如果您不需要订购,则不应提供订购。


推荐阅读