您好,登錄后才能下訂單哦!
SELECT 45, COUNT(0)
FROM ac_dealer_sales ds
WHERE ds.user_id in (SELECT du.user_id FROM ac_dept_user du
WHERE du.is_main = 1 AND fun_get_team_id(du.dept_id)= 23)
這個sql 期望的返回值 是 5000.
但是實際執行的返回值 是 8000.
把這個sql 拆為 一個 select count(*) from tab where id in ( selectd id from tab).
tab = ( create table tab as ( subquery) )
sub query 中 包含了 一個UDF fun_get_team_id( int) return int
結果與期望結果是一直的.
如果 UDF 在 selectd * from tab where id in ( select * from tab where UDF() .... )
這種形式的 sql 語句中. mysql 執行計劃 忽略了 UDF 的存在. 導致結果不準確.
將 語句改寫為 一個 tab 與一個 subquery 關聯 的寫法. 結果是正確的.
SELECT COUNT(1)
FROM ac_dealer_sales a,(SELECT du.user_id FROM ac_dept_user du
WHERE du.is_main = 1 AND fun_get_team_id(du.dept_id)= 23) b
WHERE a.user_id = b.user_id
UDF 單獨 在 select 部分, 還是 在 where 部分 都沒有問題.
跟 UDF 本身的實現邏輯沒有關系. 但是在 IN ( ) 子句中 執行計劃 則忽略了 UDF 的過濾條件.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。