Oracle数据库中的ROWNUM和ORDER BY执行顺序

摘要:
很多问题产生的原因,是因为我们不知道底层的规则,从而没有表达出我们真正的逻辑

问题背景:

问题背景:在会籍查询的时候,前几页都是一样的内容,这是查询语句

SELECT name FROM(SELECT a.*,ROWNUM AS RN FROM(select bti.account,bti.name,spd.name dept_name_2,spd_spd.name dept_name,to_char(bti.intrade_date,'yyyy-mm-dd') intrade_date,bti.birthday,
			decode(bti.trade_status,0,'未入会',1,'已入会',2,'已退会',3,'欠费被退会')trade_status,bti.leaguer_no,
			decode(bti.leaguer_type,1,'编制人员',2,'非编制人员',3,'类型3',4,'类型4',5,'类型5')leaguer_type,
			decode(bti.sex,1,'男',0,'女')sex,bti.card_no,bti.nation,bti.email,bti.post,bti.duties,bti.memo,
            bti.tele_phone,bti.trade_memo,
            	spc1.NAME political_status,
				spc2.NAME card_type,
				spc3.NAME qualifications,
				spc4.NAME degree
			from bi_trade_info bti
			left join sys_p_department spd on bti.dept_id=spd.id
			left join SYS_PA_CODE spc1 on BTI.POLITICAL_STATUS=SPC1.CODE_NUM and spc1.CODE_TABLE='BI_TRADE_INFO' and SPC1.CODE_FIELD='POLITICAL_STATUS'
            left join SYS_PA_CODE spc2 on BTI.CARD_TYPE =SPC2.CODE_NUM and spc2.CODE_TABLE='BI_TRADE_INFO' and SPC2.CODE_FIELD='CARD_TYPE'
            left join SYS_PA_CODE spc3 on BTI.QUALIFICATIONS =SPC3.CODE_NUM and spc3.CODE_TABLE='BI_TRADE_INFO' and SPC3.CODE_FIELD='QUALIFICATIONS'
            left join SYS_PA_CODE spc4 on BTI.DEGREE =SPC4.CODE_NUM and spc4.CODE_TABLE='BI_TRADE_INFO' and SPC4.CODE_FIELD='DEGREE'
            left join (select spd1.id id,spd1.PARENT_ID PARENT_ID,spd2."NAME"  from sys_p_department spd1, sys_p_department spd2 where spd1.parent_id=spd2.id)spd_spd on bti.dept_id=spd_spd.id
			where 1=1
						order by bti.intrade_date desc) a WHERE ROWNUM<=39) WHERE RN>26;

产生这个问题的的原因:

如果ORDERBY的基准字段是表的PrimaryKey,则查询执行过程是先对表进行排序,然后为排序后的表视图从第一行到最后一行赋予ROWNUM值。
反之,如果ORDERBY的基准字段不是PK,则先从第一行到最后一行为表赋予ROWNUM值,然后进行排序。
参考文献:https://blog.csdn.net/liuwenbiao1203/article/details/52216819

解决的办法

解决这个问题的办法:
就是将order by 后面的字段编程主键,注意主键就是唯一能标识一组元祖的属性/属性组
如:order by bti.intrade_date desc,bti.rowid

补充:

在审批的时候排序的时候也出现了这个问题,而且我后来发现 时间为空值,就是最大的时间
在这里插入图片描述

简单记录一下debug的过程:

简言之就是一层一层检查,确保每一层的结果都和我们的逻辑吻合
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值