读书人

极度奇怪的难题请大侠帮小弟我看看

发布时间: 2012-10-26 10:30:59 作者: rapoo

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

SQL code
DECLARE @i INTSET ROWCOUNT 1SELECT @i=id FROM dbo.UsersPRINT @i


这样输出的竟然是2

SQL code
DECLARE @i INTSET ROWCOUNT 1SELECT @i=id FROM dbo.Users ORDER BY id ascPRINT @i


这样输出就是1

然后不写SET ROWCOUNT

SQL code
DECLARE @i INTSELECT @i=id FROM dbo.Users ORDER BY idPRINT @i


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

然后不写order

SQL code
DECLARE @i INTSELECT @i=id FROM dbo.UsersPRINT @i

输出变成1了。

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

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

读书人网 >SQL Server

热点推荐