日期:2014-05-17  浏览次数:20489 次

极度奇怪的难题,请大侠帮我看看
一个表USER,就一个列ID,里面有1,2,3三行,ID是主键就是按升序排的

SQL code
DECLARE @i INT
SET ROWCOUNT 1
SELECT @i=id FROM dbo.Users
PRINT @i


这样输出的竟然是2

SQL code
DECLARE @i INT
SET ROWCOUNT 1
SELECT @i=id FROM dbo.Users ORDER BY id asc
PRINT @i


这样输出就是1

然后不写SET ROWCOUNT

SQL code
DECLARE @i INT
SELECT @i=id FROM dbo.Users ORDER BY id
PRINT @i


这样输出是3,就是把最后一个值赋予@i了

然后不写order

SQL code
DECLARE @i INT
SELECT @i=id FROM dbo.Users
PRINT @i

输出变成1了。

谁能解释上述4种情况的原理,我找不出原因,非常感谢

------解决方案--------------------
先问个问题,你的自增ID上有聚集索引吗?
------解决方案--------------------
你先看看执行计划里面用到的是什么,聚集索引还会索引
------解决方案--------------------
在你不指定排序的情况下,查询的结果就有可能 根据 查询时 系统自动选用的‘索引’ 有关系,并不是说 有了聚集索引 ,查询结果的顺序就跟聚集索引有关 而是跟 查询时 走的 索引有关。 你可以 查询时 指定 索引然后看 结果的排序 就可以知道
------解决方案--------------------
order by、top n才是精确的做法,它是有保证的
否则,只能取决于数据库自己的不同实现而不同了,它是不保证的