我有一个对表的t-sql查询,需要在其中返回最上面的行。在mysql中,这是按预期工作的,但是在sqlserver中,我得到了一个不同的返回数据,这是相当令人费解的。
我附带了三个屏幕截图:1个是表设计,1个是仅查看前10行时返回的数据,1个是查看前1000行时返回的数据。您将注意到最上面的行包含两个查询之间的name列的不同信息。
查询中唯一的区别是 TOP
关键字。此表共有7行数据。结果与 Top 1000
包含返回的行的正确顺序。这是怎么回事?
为什么SQLServer会根据返回行的计数值更改返回行的顺序 TOP
关键字?有人能解释或提供一种方法来保持一致性,而不管返回多少行吗?
3条答案
按热度按时间laximzn51#
Order by
不能保证为相等的值提供相同的结果,因为sql表表示无序集。因为你们的宽度是一样的,所以你们得到的结果是不同的。要获得唯一的结果或使排序稳定,需要添加一个列名,如
itemNumber
给你的order by
条款。ne5o7dgx2#
输出中没有差异或问题。您是按宽度排序的,前两个宽度是相同的,并且您没有任何子排序,因此它将决定权留给rdbms(特别是它的查询优化器)来呈现哪一个
您还应该添加
itemNumber
给你的ORDER BY
后面的子句Width
```ORDER BY Width, itemNumber
eqqqjvef3#
为了在这个问题中添加一些上下文,我试图实现mysql和mssql在返回的行顺序上的一致性。我正在将一个使用mysql的项目转换为mssql,这给我带来了一个问题。得到我想要的东西的解决办法是使用
Set Rowcount 1
限制返回的行数。这产生了1行数据,其排序方式与mysql相同。