使用“ SELECT TOP”查询发生意外的SQL行为

时间:2019-11-09 23:19:06

标签: sql sql-server tsql select ssms

我正在使用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中的基础实现,尽管它仍满足已记录的行为。

4 个答案:

答案 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引擎的先前操作返回结果,这些操作可能并不总是相同的,并且肯定不是您期望的那样。