SELECT TOP 1 ...有些东西...... ORDER BY DES给出了不同的结果

时间:2012-12-04 14:10:01

标签: sql

SELECT TOP 1 Col1,col2
FROM table ... JOIN table2
...Some stuff...
 ORDER BY DESC

给出不同的结果。与

相比
SELECT Col1,col2
FROM table ... JOIN table2
...Some stuff...
 ORDER BY DESC

第二个查询给了我一些行,当我想要这个结果的前1时,我用TOP 1子句写第一个查询。这些都给出了不同的结果。

为什么这种行为不同

3 个答案:

答案 0 :(得分:4)

这不是很清楚,但我想你的意思是第一个查询返回的行与第二个查询返回的第一行不一样。这可能是因为您的订单中包含重复值。

比如说,你有一个名为Test

的表
+-----+------+
| Seq | Name |
+-----+------+
| 1   | A    |
| 1   | B    |
| 2   | C    |
+-----+------+

如果您执行了Select * From Test Order By Seq,则其中任何一个都有效

+-----+------+
| Seq | Name |
+-----+------+
| 1   | A    |
| 1   | B    |
| 2   | C    |
+-----+------+

+-----+------+
| Seq | Name |
+-----+------+
| 1   | B    |
| 1   | A    |
| 2   | C    |
+-----+------+

使用顶部,您可以获得任一行。

拥有前1个子句可能意味着查询优化器使用完全不同的方法来生成结果。

答案 1 :(得分:1)

我将假设您在SQL Server中工作,因此Laurence的答案可能准确无误。但为了完整起见,这还取决于您使用的数据库技术。

通常,基于索引的数据库(如SQL Server)将返回按索引排序的结果,具体取决于创建执行计划的方式。但并非所有数据库都使用索引。

例如,Netezza在没有索引概念的情况下跟踪数据在系统中的位置(Netezza的系统架构有点不同)。因此,选择查询的第一条记录将导致结果集中的随机记录浮动到顶部。多次执行相同的查询可能会导致每次都有不同的顺序。

如果您需要订购数据,那么最好自己强制执行订购,而不是依赖数据库在创建执行计划时使用的任意顺序。这将使您的结果更具可预测性。

答案 2 :(得分:-3)

您的第一个查询将获得一个表的顶行,并与具有条件的另一个表进行比较。因此,与普通连接相比,它将返回不同的值。