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

Popular posts from this blog

c# - How to set Z index when using WPF DrawingContext? -

razor - Is this a bug in WebMatrix PageData? -

visual c++ - Using relative values in array sorting ( asm ) -