A left join B B表有多條記錄,max(create_time)取最新一條


例如: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復雜度,且如果表數量級大,有風險!最好自己在從庫測試一下性能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM