问题见图中的SQL查询导致下面的结果,注意RowID是倒序的,这是为什么?正常情况下无论怎么处理都应该生成RowID正序的吗?原因为什么呀?
btw:这里有些奇怪地方:
1.只要把SELECT中的子查询去掉RowID就是正序的了!
2.将箭头指向的DESC换成ASC也会使ROWID正序了!
当然,这里面肯定是有我不知道的原理造成的,不过,到底什么原因造成的,请大神给出详细的说明,万分感谢。
需要排序的话,最后在加上 order by RowID
正常情况不是应该正序的吗?仔细看看Row_number使用,还有我标注
over 里面的order不要加desc
这不明白让序号反着排嘛
你说的不靠谱,desc是为了让code倒序,到时row_number会在结果的基础上正序,话说你经常使用row_number吗?
@hengxinyi: 还真算是经常用··
over里的那个排序是让行号在外面的结果集中升序还是降序。跟外面的结果集是升序还是降序没有关系
@吴瑞祥: 没太明白,您注意下:1.只要把SELECT中的子查询去掉RowID就是正序的了!?
我感觉这个才是原因。
@hengxinyi: 行号是在结果集上加了一列。你要分开想。想查询除了结果集,然后在结果集上根据over条件加上行号。在over里的order顺序是行号在结果集中的排序规则。关于你说的2个奇怪的地方实在是不奇怪···
@吴瑞祥: 最终原因我想我已经知道了,不过我感觉你还是没有完全理解;简单的说,SELECT中的子查询导致的问题,OVER的Order顺序最终效果是对的,实际结果也是ROWID的顺序是随着Order指定的顺序自增的,这里假定生成【结果集1】,然而生成的【结果集1】又被子查询重新排序生成【结果集2】;所以显示的是【结果集2】。
@吴瑞祥: 是我说的有问题吗?还望你再给说明一下,
我重新看了一下你写的,我再梳理一下我的理解:
1.Row_Number() Over (Order By code desc) AS RowID ,这里的Order By code不就是按照code排序后依次生成序号吗? 如果是这里的结果集应该是code倒序排列,且添加的RowID是正序排列的(1,2...)
你上面说的意思是不是这样:
按照code依次生成RowID得到的【结果集1】,这个【结果集1】是集合,所以是无序的?
@吴瑞祥:
比如将子查询去掉,即使over里的order是倒序,但是行号仍然是正序(1,2,3...)
查询的sql中没有order by 排序。
显示结果的顺序一般数据库的排序规则,表中的主键或索引等有关。
不对,
@hengxinyi: 能不能把改成asc之后的结果截图下来?
@会飞的金鱼: 改成ASC后,ROWID从1开始,第二列,第三列都一样,只是ROWID正序了。
试验了一下,没发现这种情况,帮不上了。
我说 你看看自己的结果就发现问题了 你那个desc只是ROW_NUMBER 倒序 但是你的code 还是asc的
select ROW_NUMBER() over(order by id),id from [table] order by ID desc
select ROW_NUMBER() over(order by Code desc),Code from WH.OtherOutStock order by Code desc
select ROW_NUMBER() over(order by Code),Code from WH.OtherOutStock order by Code desc
select ROW_NUMBER() over(order by Code desc),Code from WH.OtherOutStock order by Code
select ROW_NUMBER() over(order by Code ),Code from WH.OtherOutStock order by Code
你自己执行下这4句就会知道是啥原因了
看了博主的回复,我发现我得重新认识Row_Number了,谢谢!