摘要:
很多問題產生的原因,是因爲我們不知道底層的規則,從而沒有表達出我們真正的邏輯
問題背景:
問題背景:在會籍查詢的時候,前幾頁都是一樣的內容,這是查詢語句
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的過程:
簡言之就是一層一層檢查,確保每一層的結果都和我們的邏輯吻合