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的過程:

簡言之就是一層一層檢查,確保每一層的結果都和我們的邏輯吻合
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章