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

问题描述 投票:0回答:3

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

SELECT TOP 10 *
FROM  WideWorldImporters.Sales.Invoices

SELECT TOP 10 CustomerID
FROM  WideWorldImporters.Sales.Invoices

它给出结果:

enter image description here

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

完整屏幕截图:enter image description here

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

sql sql-server tsql select ssms
3个回答
3
投票

没有ORDER BY的顶部是不可预测的。这是由Microsoft记录的。从Microsoft docs

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

...

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

另请参阅how does SELECT TOP works when no order by is specified?


3
投票

您没有ORDER BY,因此将返回不确定顺序的前10个结果。此顺序可以从一次执行更改为下一次执行。

SQL中的表表示无序集。如果想要使用TOP的特定行,则需要具有ORDER BY


3
投票

此评论太长了。

在SQL中,表记录为无序。因此,像您这样的查询:

SELECT TOP 10 * FROM  WideWorldImporters.Sales.Invoices

...将产生不一致的结果,因为它缺少ORDER BY子句。您需要告诉RDBMS应该使用哪一列来排序记录,以便可以定义应返回哪些TOP记录。例如,类似:

SELECT TOP 10 * FROM  WideWorldImporters.Sales.Invoices ORDER BY InvoiceID DESC
© www.soinside.com 2019 - 2024. All rights reserved.