oracle取數(shù)據(jù)庫中最新的一條數(shù)據(jù)可能會遇到的bug(兩種情況)
記一次 開發(fā)中遇到的坑:
第一種情況 rowid
select * from table where rowid=(select max(rowid) from table )
這種方式是取最大的rowid作為最新的數(shù)據(jù),但是有一個隱患 :數(shù)據(jù)庫一旦有刪除操作,rowid不能保證每次都是遞增的!即max(rowid)并不一定就是最新的數(shù)據(jù),盡管可能不會每次復(fù)現(xiàn) 但這個問題是絕對存在的!
第二種情況 使用rownum (或相同思路)
select t.* from (select ti.sysno,ti.cr_date from t_insurance ti order by ti.selldatetime desc ) t where rownum = 1
這有很大一個問題,如果排序字段數(shù)據(jù)庫使用的是date類型,而且存在時分秒剛好相同的數(shù)據(jù)(尤其高并發(fā)項目中),我們子查詢語句中 的確可以準(zhǔn)確的 order by desc出來,但是一旦外層套了一層select ,查出來的很可能就不是子查詢里面的第一條數(shù)據(jù),詳細(xì)如圖:
11:35:25存在兩條數(shù)據(jù) 執(zhí)行選中的查詢sql,
但是 當(dāng)我們加了一層select,可以看到 已經(jīng)不是上面的第一條數(shù)據(jù)了
類似的,不管怎么寫的花里胡哨,如下sql,子查詢里面 row_row = 1時,sysno確實為3126 1018 0001 5Z14,但是外面套了一層select 結(jié)果也變了
select * from (select t.sysno, t.cr_date, row_number() over(order by t.cr_date desc) row_row from t_insurance t) where row_row = 1
同理 用with temp as 也是一樣的情況,取不到最新的結(jié)果。
解決方法:
暫時沒有從寫什么高級的sql語句層面想到好的辦法,(如果有大佬有好的方法,希望可以指點一二)
提供一些思路:如果項目沒有上生產(chǎn) 或者說是小項目,那還可以追加自增列,或者數(shù)據(jù)庫使用時間戳類型,但是上了生產(chǎn) 改動數(shù)據(jù)庫是大忌。
一般的,數(shù)據(jù)表中還會有其它的字段可以作為輔助排序,例如一段時間內(nèi)的單號是遞增的 那么可以多個字段排序 例如 order by date desc,orderNo desc ,(我是通過這種方式解決的,但還是不治根 萬一哪天遇到數(shù)據(jù)庫沒其他輔助排序字段 問題還是得不到解決)
實在不行 就根據(jù)實際業(yè)務(wù) 看看能不能對時間加限制(如果數(shù)據(jù)量不大 不加也罷),select * from table where date >=xxxx order by desc date ,然后把一堆數(shù)據(jù)查詢出來,在代碼里面list.get(0)取出第一條數(shù)據(jù)。
到此這篇關(guān)于oracle取數(shù)據(jù)庫中最新的一條數(shù)據(jù)可能會遇到的bug的文章就介紹到這了,更多相關(guān)oracle取數(shù)據(jù)庫中最新的一條數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- zabbix agent2 監(jiān)控oracle數(shù)據(jù)庫的方法
- Python查詢oracle數(shù)據(jù)庫速度慢的解決方案
- ORACLE數(shù)據(jù)庫對long類型字段進(jìn)行模糊匹配的解決思路
- 配置python連接oracle讀取excel數(shù)據(jù)寫入數(shù)據(jù)庫的操作流程
- SpringBoot多數(shù)據(jù)庫連接(mysql+oracle)的實現(xiàn)
- 使用zabbix監(jiān)控oracle數(shù)據(jù)庫的方法詳解
- Oracle數(shù)據(jù)庫下載與安裝的完整步驟
- QT連接Oracle數(shù)據(jù)庫并實現(xiàn)登錄驗證的操作步驟
- 使用IDEA對Oracle數(shù)據(jù)庫進(jìn)行簡單增刪改查操作
- Oracle數(shù)據(jù)庫scott用戶創(chuàng)建view視圖權(quán)限的操作方法
- ORACLE數(shù)據(jù)庫應(yīng)用開發(fā)的三十個注意事項
相關(guān)文章
oracle刪除主鍵查看主鍵約束及創(chuàng)建聯(lián)合主鍵
本節(jié)文章主要介紹了oracle刪除主鍵查看主鍵約束及創(chuàng)建聯(lián)合主鍵,示例代碼如下,需要的朋友可以參考下2014-07-07Oracle數(shù)據(jù)塊實現(xiàn)原理深入解讀
Oracle對數(shù)據(jù)庫數(shù)據(jù)文件(datafile)中的存儲空間進(jìn)行管理的單位是數(shù)據(jù)塊(data block),本文將詳細(xì)介紹2012-11-11oracle數(shù)據(jù)庫定時任務(wù)dbms_job的用法詳解
這篇文章給大家詳細(xì)介紹了dbms_job的用法,用于安排和管理作業(yè)隊列,通過使用作業(yè),可以使ORACLE數(shù)據(jù)庫定期執(zhí)行特定的任務(wù)。有需要的朋友們可以參考借鑒。2016-09-09Oracle數(shù)據(jù)庫密碼重置、導(dǎo)入導(dǎo)出庫命令示例應(yīng)用
本節(jié)主要介紹了Oracle數(shù)據(jù)庫密碼重置、導(dǎo)入導(dǎo)出庫命令的基本使用,有需要的朋友可以學(xué)習(xí)下2014-07-07PL/SQL編程經(jīng)驗小結(jié)開發(fā)者網(wǎng)絡(luò)Oracle
PL/SQL編程經(jīng)驗小結(jié)開發(fā)者網(wǎng)絡(luò)Oracle...2007-03-03Oracle中查詢表結(jié)構(gòu)的6種方法總結(jié)
工作中查看oracle表結(jié)構(gòu)經(jīng)常會遇到,下面這篇文章主要給大家介紹了關(guān)于Oracle中查詢表結(jié)構(gòu)的6種方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04