极度奇怪的难题,请大侠帮小弟我看看
极度奇怪的难题,请大侠帮我看看一个表USER,就一个列ID,里面有1,2,3三行,ID是主键就是按升序排的SQL codeDE
极度奇怪的难题,请大侠帮我看看
一个表USER,就一个列ID,里面有1,2,3三行,ID是主键就是按升序排的
SQL codeDECLARE @i INTSET ROWCOUNT 1SELECT @i=id FROM dbo.UsersPRINT @i
这样输出的竟然是2
SQL codeDECLARE @i INTSET ROWCOUNT 1SELECT @i=id FROM dbo.Users ORDER BY id ascPRINT @i
这样输出就是1
然后不写SET ROWCOUNT
SQL codeDECLARE @i INTSELECT @i=id FROM dbo.Users ORDER BY idPRINT @i
这样输出是3,就是把最后一个值赋予@i了
然后不写order
SQL codeDECLARE @i INTSELECT @i=id FROM dbo.UsersPRINT @i
输出变成1了。
谁能解释上述4种情况的原理,我找不出原因,非常感谢
[解决办法]先问个问题,你的自增ID上有聚集索引吗?
[解决办法]你先看看执行计划里面用到的是什么,聚集索引还会索引
[解决办法]在你不指定排序的情况下,查询的结果就有可能 根据 查询时 系统自动选用的‘索引’ 有关系,并不是说 有了聚集索引 ,查询结果的顺序就跟聚集索引有关 而是跟 查询时 走的 索引有关。 你可以 查询时 指定 索引然后看 结果的排序 就可以知道
[解决办法]order by、top n才是精确的做法,它是有保证的
否则,只能取决于数据库自己的不同实现而不同了,它是不保证的