例如:A表合同表t_contract B表合同審核表t_contract_audit。兩個表根據contract_id關聯。且一條合同有多條審核記錄。求:A.合同狀態、B.最新審核記錄結果。
簡單:A 1--key--n B ---》A.*+B.*。
方案1:
A作為主表單獨查詢,遍歷list, 查詢每一個合同對應的B表,按照創建時間倒序取第一條。
性能:
如果是分頁查詢,比如一頁10條,此方案分兩步,思路清晰,SQL簡單,不會出現”大數據量的多表關聯慢查詢“。
方案2:
1)處理B表,按照contract_id只保留創建時間最新的一條。(當然子查詢也可以,個人認為不如inner join 好理解)
SELECT a.* FROM t_contract_audit a INNER JOIN ( SELECT contract_id, max( create_time ) create_time FROM t_contract_audit GROUP BY contract_id ) b ON a.contract_id = b.contract_id AND a.create_time = b.create_time
2)把第一步處理結果作為R表:select A.*,R.* from A left join R on A.contract_id=R.contract_id
SELECT h.*,r.* FROM t_contract h left JOIN (SELECT a.* FROM t_contract_audit a INNER JOIN ( SELECT contract_id, max( create_time ) create_time FROM t_contract_audit GROUP BY contract_id ) b ON a.contract_id = b.contract_id AND a.create_time = b.create_time ) r ON h.contract_id = r.contract_id where h.sale_id=2702 and h.contract_status IN (8,9) order by h.create_time desc
性能:
一條SQL搞定,有一定SQL復雜度,且如果表數量級大,有風險!最好自己在從庫測試一下性能。