首页 新闻 会员 周边 捐助

SQL SERVER中的Row_Number函数问题,奇怪!

0
悬赏园豆:60 [已关闭问题] 关闭于 2014-08-08 16:19

问题见图中的SQL查询导致下面的结果,注意RowID是倒序的,这是为什么?正常情况下无论怎么处理都应该生成RowID正序的吗?原因为什么呀?

 

btw:这里有些奇怪地方:

1.只要把SELECT中的子查询去掉RowID就是正序的了!

2.将箭头指向的DESC换成ASC也会使ROWID正序了!

 

当然,这里面肯定是有我不知道的原理造成的,不过,到底什么原因造成的,请大神给出详细的说明,万分感谢。

SQL
hengxinyi的主页 hengxinyi | 初学一级 | 园豆:5
提问于:2014-07-05 01:16
< >
分享
所有回答(6)
0

需要排序的话,最后在加上 order by RowID

Firen | 园豆:5385 (大侠五级) | 2014-07-05 06:18

正常情况不是应该正序的吗?仔细看看Row_number使用,还有我标注

支持(0) 反对(0) hengxinyi | 园豆:5 (初学一级) | 2014-07-05 10:31
0

over 里面的order不要加desc

这不明白让序号反着排嘛

吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-05 08:05

你说的不靠谱,desc是为了让code倒序,到时row_number会在结果的基础上正序,话说你经常使用row_number吗?

支持(0) 反对(0) hengxinyi | 园豆:5 (初学一级) | 2014-07-05 10:32

@hengxinyi: 还真算是经常用··

over里的那个排序是让行号在外面的结果集中升序还是降序。跟外面的结果集是升序还是降序没有关系

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-05 10:43

@吴瑞祥: 没太明白,您注意下:1.只要把SELECT中的子查询去掉RowID就是正序的了!?

我感觉这个才是原因。

支持(0) 反对(0) hengxinyi | 园豆:5 (初学一级) | 2014-07-05 11:14

@hengxinyi: 行号是在结果集上加了一列。你要分开想。想查询除了结果集,然后在结果集上根据over条件加上行号。在over里的order顺序是行号在结果集中的排序规则。关于你说的2个奇怪的地方实在是不奇怪···

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-05 13:39

@吴瑞祥: 最终原因我想我已经知道了,不过我感觉你还是没有完全理解;简单的说,SELECT中的子查询导致的问题,OVER的Order顺序最终效果是对的,实际结果也是ROWID的顺序是随着Order指定的顺序自增的,这里假定生成【结果集1】,然而生成的【结果集1】又被子查询重新排序生成【结果集2】;所以显示的是【结果集2】。

支持(0) 反对(0) hengxinyi | 园豆:5 (初学一级) | 2014-07-05 14:56

@吴瑞祥: 是我说的有问题吗?还望你再给说明一下,

我重新看了一下你写的,我再梳理一下我的理解:

1.Row_Number() Over (Order By code desc) AS RowID ,这里的Order By code不就是按照code排序后依次生成序号吗? 如果是这里的结果集应该是code倒序排列,且添加的RowID是正序排列的(1,2...)

你上面说的意思是不是这样:
按照code依次生成RowID得到的【结果集1】,这个【结果集1】是集合,所以是无序的?

支持(0) 反对(0) hengxinyi | 园豆:5 (初学一级) | 2014-07-06 00:42

@吴瑞祥: 

比如将子查询去掉,即使over里的order是倒序,但是行号仍然是正序(1,2,3...)

支持(0) 反对(0) hengxinyi | 园豆:5 (初学一级) | 2014-07-06 00:46
0

查询的sql中没有order by 排序。

显示结果的顺序一般数据库的排序规则,表中的主键或索引等有关。

会飞的金鱼 | 园豆:881 (小虾三级) | 2014-07-05 11:08

不对,

支持(0) 反对(0) hengxinyi | 园豆:5 (初学一级) | 2014-07-05 11:15

@hengxinyi: 能不能把改成asc之后的结果截图下来?

支持(0) 反对(0) 会飞的金鱼 | 园豆:881 (小虾三级) | 2014-07-05 14:21

@会飞的金鱼: 改成ASC后,ROWID从1开始,第二列,第三列都一样,只是ROWID正序了。

支持(0) 反对(0) hengxinyi | 园豆:5 (初学一级) | 2014-07-05 14:58
0

试验了一下,没发现这种情况,帮不上了。

Muse | 园豆:441 (菜鸟二级) | 2014-07-06 22:44
0

我说 你看看自己的结果就发现问题了 你那个desc只是ROW_NUMBER 倒序  但是你的code 还是asc的
select ROW_NUMBER() over(order by id),id from [table] order by ID desc

丫的 | 园豆:1575 (小虾三级) | 2014-07-07 15:27

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句就会知道是啥原因了

支持(0) 反对(0) 丫的 | 园豆:1575 (小虾三级) | 2014-07-07 15:30
0

看了博主的回复,我发现我得重新认识Row_Number了,谢谢!

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-10 16:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册