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 子句编写第一个查询。这些都给出了不同的结果。
为什么这种行为不同
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 子句编写第一个查询。这些都给出了不同的结果。
为什么这种行为不同
这不是很清楚,但我猜你的意思是第一个查询返回的行与第二个查询返回的第一行不同。这可能是因为您的 order by 中有重复的值。
例如,假设您有一个名为 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 |
+-----+------+
使用顶部,您可以获得任一行。
拥有 top 1 子句可能意味着查询优化器使用完全不同的方法来生成结果。
我将假设您在 SQL Server 中工作,因此 Laurence 的回答可能是准确的。但为了完整起见,这也取决于您使用的数据库技术。
通常,基于索引的数据库(如 SQL Server)将返回按索引排序的结果,具体取决于执行计划的创建方式。但并非所有数据库都使用索引。
例如,Netezza 在没有索引概念的情况下跟踪数据在系统中的位置(Netezza 的系统架构有很大不同)。因此,选择查询的第一条记录将导致结果集中的随机记录浮动到顶部。多次执行相同的查询可能会导致每次的顺序不同。
如果您需要对数据进行排序,那么最好自己强制执行排序,而不是依赖数据库在创建其执行计划时将使用的任意排序。这将使您的结果更可预测。
您的第一个查询将获得一个表的第一行并与另一个表进行比较。因此,与普通连接相比,它将返回不同的值。