left join ,查詢結果集排序後取第一條資料
阿新 • • 發佈:2019-01-26
最近改一個問題,改sql語句,大概意思是 左關聯 A 表 和 B表, 按照條件查詢後對查詢結果排序後結果集的第一條資料。
原始的SQL:
select a.id from A a left join B b on a.id = b. id
where a.userid = 'name'
and rownum = 1
order by a.p;
當時的問題是,如果查詢的結果裡有 多條資料,這個儲存過程最後 返回的結果不正確,不是排序後的第一條資料。
除錯的方法:用呼叫儲存過程是的引數直接在資料庫中直接執行該語句,看是否是儲存過程中的SQL寫的有問題,但是直接執行SQL的結果卻是正確的!
當時就很鬱悶,同樣的引數,頁面呼叫儲存過程和在資料庫中直接執行SQL的語句怎麼結果不一樣呢。再看這個SQL寫的也沒問題啊。
很長時間過去了,還沒定位出來,我一直在糾結怎麼兩種方式的執行結果不一致。最後突然想到,這個原來的開發這樣寫的目的就是想對查詢結果先排序再取第一條資料,終於明白了。
SQL應該這樣寫:
select c.id from (select a.id from A a left join B b on a.id = b. id
where a.userid = 't1'
order by a.p) c where and rownum = 1;
最終問題解決了。總結:對於維護專案,常常改別人的程式碼,而且有時候根本就不熟悉業務邏輯,所以常常是很簡單的問題定位起來很困難,所以某一段程式碼的目的很重要,也就是這段程式要實現什麼功能。轉換思路看問題。