tsql - 为什么在空列上使用 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。
关于发生了什么的任何想法?
解决方案
这是 SQL Server 在未指定显式排序时确定自己的记录排序的典型示例。从排序的角度来看,这也适用于所有似乎“相等”的记录。(在这种情况下:所有记录。)
所以你确实指定了一个顺序,但它没有逻辑效果,因为根据你指定的顺序,所有记录都是“相等的”。所以最后 SQL Server 自己确定排序。
为什么它与根本没有排序的查询不同?或者与使用 TOP 等相关功能但具有其他参数值的查询不同?只有微软的工程师可能知道。这可能与复杂的 SQL Server 引擎的内部实现有关。
严格来说,这根本不重要。否则,无论如何您都会提供有效的订购。;) 出于性能原因:如果您不需要订购,则不应提供订购。
推荐阅读
- flutter - 如何实现嵌套在ui中的json数组flutter
- linux - 如何 git 克隆/签出标签哈希并仅提取指定的文件夹/文件?
- android - 在android中发送带有特殊字符的USSD代码
- javascript - 如何在 d3 中增加日期轴的范围?
- python - Django-import-export 总是导入空值
- javascript - 转换为base64后如何将画布图像插入数据库
- jquery - 如何在 Flask 中单击按钮时调用 Ajax
- c# - 创建在 C# 中检索 Auth0 管理 API v2 令牌的服务器端进程
- google-cloud-platform - GCP中的图像和快照有什么区别
- nginx - 你能让 .htaccess 传递 PHP 参数吗