mysql - efficient join needed against a virtual table used multiple times in a subquery -
i trying run query similar one:
select s.custno, s.prodno, if(daycode = 1, (select avg(sell) sales ss join (select distinct `prodno` `familycode` prodfamily = 101) f2 on f2.prodno = ss.prodno ss.custno = 800 , ss.weekno = s.weekno - 1), (select avg(sell) sales ss join (select distinct `prodno` `familycode` prodfam = 101) f3 on f3.prodno = ss.prodno ss.custno = 800 , ss.weekno = s.weekno)) weekavg sales s join product p on p.prodno = s.prodno join (select distinct `prodno` `familycode` prodfamily = 101) f on f.prodno = s.prodno s.custno = 800 order ardate8n asc, s.custno, s.prodno
in query products week average based on daycode param product family.
a product belongs product family.
- if daycode = 1 want same product family average of previous week.
- else want average on current week same product family.
as see f
,f2
,f3
similar virtual tables, helps link against existing products based on product family.
how query rewritten not compute f2
, f3
tables, slow process.
i don't have mysql environment available me atm, memory , not run against mocked tables.
first, try stick joins, filtering done against familycode 'distinct' marker. not know data in familycode, compare working slow query new 1 , watch 'sales spike' duplicates!
from sales ss join (select distinct `prodno` `familycode` prodfamily = 101) f2 on f2.prodno = ss.prodno ss.custno = 800
becomes
sales ss join familycode f2 on f2.prodno = ss.prodno ss.custno = 800 , f2.prodfamily = 101
my second approach, , if duplicates sales spike issue, try 'exists' clause instead of 'distinct' clause. solution this:
from sales ss join familycode f2 on f2.prodno = ss.prodno ss.custno = 800 , exists (select 1 familycode f2 f2.prodno = ss.prodno , f2.prodfamily= 101)
Comments
Post a Comment