我正在使用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中的基础实现,尽管它仍满足已记录的行为。
答案 0 :(得分:5)
没有ORDER BY的TOP是不可预测的。这是由Microsoft记录的。来自https://HOSTNAME/foo:
当将TOP与ORDER BY子句一起使用时,结果集将限制为前N个有序行。否则,TOP将以不确定的顺序返回前N行。
...
在SELECT语句中,始终将ORDER BY子句与TOP子句一起使用。因为,这是可预测地指示哪些行受TOP影响的唯一方法。
另请参阅Microsoft docs
答案 1 :(得分:4)
您没有<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script src="https://unpkg.com/styled-components/dist/styled-components.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="app"></div>
,因此将返回不确定顺序的前10个结果。此顺序可以从一次执行更改为下一次执行。
SQL中的表表示无序集。如果要使用ORDER BY
来进行特定的行,则需要有一个TOP
。
答案 2 :(得分:4)
这个评论太长了。
在SQL中,表记录是无序。因此,像您这样的查询:
SELECT TOP 10 * FROM WideWorldImporters.Sales.Invoices
...将产生不一致的结果,因为它缺少ORDER BY
子句。您需要告诉RDBMS应该使用哪一列来对记录进行排序,以便可以定义应返回哪些TOP
条记录。例如,类似:
SELECT TOP 10 * FROM WideWorldImporters.Sales.Invoices ORDER BY InvoiceID DESC
答案 3 :(得分:0)
此结果绝对正常,因为您的查询未指定顺序。前10个返回前10个结果。
如果不指定任何排序子句,则将根据SQL引擎的先前操作返回结果,这些操作可能并不总是相同的,并且肯定不是您期望的那样。