从品牌网站建设到网络营销策划,从策略到执行的一站式服务
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 的过滤条件.
成都网站建设公司地址:成都市青羊区太升南路288号锦天国际A座10层 建设咨询028-86922220
成都快上网科技有限公司-四川网站建设设计公司 | 蜀ICP备19037934号 Copyright 2020,ALL Rights Reserved cdkjz.cn | 成都网站建设 | © Copyright 2020版权所有.
专家团队为您提供成都网站建设,成都网站设计,成都品牌网站设计,成都营销型网站制作等服务,成都建网站就找快上网! | 成都网站建设哪家好? | 网站建设地图