我正在使用Microsoft SQL Server 2019并执行时:
SELECT TOP 10 *
FROM WideWorldImporters.Sales.Invoices
SELECT TOP 10 CustomerID
FROM WideWorldImporters.Sales.Invoices
它给出结果:
这是不正确的,因为它们不是第一个查询显示的“前10个”客户ID。
编辑:我上面期望的行为与SQL Sever 2014中实际发生的情况相同。我怀疑它们更改了SQL Server 2019中的基础实现,尽管它仍满足已记录的行为。
没有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?
您没有ORDER BY
,因此将返回不确定顺序的前10个结果。此顺序可以从一次执行更改为下一次执行。
SQL中的表表示无序集。如果想要使用TOP
的特定行,则需要具有ORDER BY
。
此评论太长了。
在SQL中,表记录为无序。因此,像您这样的查询:
SELECT TOP 10 * FROM WideWorldImporters.Sales.Invoices
...将产生不一致的结果,因为它缺少ORDER BY
子句。您需要告诉RDBMS应该使用哪一列来排序记录,以便可以定义应返回哪些TOP
记录。例如,类似:
SELECT TOP 10 * FROM WideWorldImporters.Sales.Invoices ORDER BY InvoiceID DESC