与“ SELECT TOP”查询意外的SQL行为

NoN*_*ame -1 sql t-sql sql-server select ssms

我正在使用Microsoft SQL Server 2019并在执行时:

SELECT TOP 10 *
FROM  WideWorldImporters.Sales.Invoices

SELECT TOP 10 CustomerID
FROM  WideWorldImporters.Sales.Invoices
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此处输入图片说明

这是不正确的,因为它们不是第一个查询显示的“前10个”客户ID。

完整截图: 在此处输入图片说明

编辑:我上面期望的行为与SQL Sever 2014中实际发生的情况相同。我怀疑它们更改了SQL Server 2019中的基础实现,尽管它仍满足已记录的行为。

Jul*_*ian 5

没有ORDER BY的TOP是不可预测的。这是由Microsoft记录的。从Microsoft文档

当您将TOP与ORDER BY子句一起使用时,结果集限制为前N个有序行。否则,TOP将以不确定的顺序返回前N行。

...

在SELECT语句中,始终将ORDER BY子句与TOP子句一起使用。因为,这是可预测地指示哪些行受TOP影响的唯一方法。

另请参见未指定排序依据时SELECT TOP如何工作?