oracle取數據庫中最新的一條數據可能會遇到的bug(兩種情況)
記一次 開發中遇到的坑:
第一種情況 rowid
select * from table where rowid=(select max(rowid) from table )
這種方式是取最大的rowid作為最新的數據,但是有一個隱患 :數據庫一旦有刪除操作,rowid不能保證每次都是遞增的!即max(rowid)並不一定就是最新的數據,盡管可能不會每次復現 但這個問題是絕對存在的!
第二種情況 使用rownum (或相同思路)
select t.* from (select ti.sysno,ti.cr_date from t_insurance ti order by ti.selldatetime desc ) t where rownum = 1
這有很大一個問題,如果排序字段數據庫使用的是date類型,而且存在時分秒剛好相同的數據(尤其高並發項目中),我們子查詢語句中 的確可以準確的 order by desc出來,但是一旦外層套瞭一層select ,查出來的很可能就不是子查詢裡面的第一條數據,詳細如圖:
11:35:25存在兩條數據 執行選中的查詢sql,
但是 當我們加瞭一層select,可以看到 已經不是上面的第一條數據瞭
類似的,不管怎麼寫的花裡胡哨,如下sql,子查詢裡面 row_row = 1時,sysno確實為3126 1018 0001 5Z14,但是外面套瞭一層select 結果也變瞭
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 也是一樣的情況,取不到最新的結果。
解決方法:
暫時沒有從寫什麼高級的sql語句層面想到好的辦法,(如果有大佬有好的方法,希望可以指點一二)
提供一些思路:如果項目沒有上生產 或者說是小項目,那還可以追加自增列,或者數據庫使用時間戳類型,但是上瞭生產 改動數據庫是大忌。
一般的,數據表中還會有其它的字段可以作為輔助排序,例如一段時間內的單號是遞增的 那麼可以多個字段排序 例如 order by date desc,orderNo desc ,(我是通過這種方式解決的,但還是不治根 萬一哪天遇到數據庫沒其他輔助排序字段 問題還是得不到解決)
實在不行 就根據實際業務 看看能不能對時間加限制(如果數據量不大 不加也罷),select * from table where date >=xxxx order by desc date ,然後把一堆數據查詢出來,在代碼裡面list.get(0)取出第一條數據。
到此這篇關於oracle取數據庫中最新的一條數據可能會遇到的bug的文章就介紹到這瞭,更多相關oracle取數據庫中最新的一條數據內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- MySql分頁時使用limit+order by會出現數據重復問題解決
- MySQL中符號@的作用
- Oracle 生成未來三天的整點時間(步驟詳解)
- SQL數據庫的所有命令(函數、運算符)匯總大全
- ORACLE數據庫應用開發的三十個註意事項