sam wun <[EMAIL PROTECTED]> wrote on 01/19/2005 07:02:37 AM:

> Hi list,
> 
> The following sql statement takes 3 mintues to complete the query. How 
> can I improve its speed?
> select DISTINCT i.basename from inventory i, transaction t, customer c 
> where i.prodcode = t.prodcode and c.custcode = t.custcode and i.basename 

> is not NULL and i.prodname is not NULL and ((date(t.date) >= 
> "2004-01-01" and date(t.date) <= "2004-01-31") and i.basename IN (select 

> DISTINCT ii.basename from inventory ii, transaction tt, customer cc 
> where ii.prodcode = tt.prodcode and cc.custcode = tt.custcode and 
> ii.basename is not NULL and ii.prodname is not NULL and(date(tt.date) >= 

> "2005-01-01" and date(tt.date) <= "2005-01-31"))) order by i.basename
> 
> Thanks
> Sam
> 
> 

I would simplify it by converting everything to us explicit (not implicit) 
JOIN statements,skipping unnecessary type conversions,  and logically 
merging your conditions. Here is your original query, slightly 
reformatted.

SELECT DISTINCT i.basename 
FROM inventory i, transaction t, customer c 
WHERE i.prodcode = t.prodcode 
        and c.custcode = t.custcode 
        and i.basename is not NULL 
        and i.prodname is not NULL 
        and (
                (date(t.date) >= "2004-01-01" 
                and date(t.date) <= "2004-01-31"
        ) 
        and i.basename IN (
                select DISTINCT ii.basename 
                from inventory ii, transaction tt, customer cc 
                where ii.prodcode = tt.prodcode 
                and cc.custcode = tt.custcode 
                and ii.basename is not NULL 
                and ii.prodname is not NULL 
                and(
                        date(tt.date) >= "2005-01-01" 
                        and date(tt.date) <= "2005-01-31")
                )
        ) 
order by i.basename

Here is my proposal:

SELECT DISTINCT i.basename 
FROM inventory i
INNER JOIN transaction t
        ON i.prodcode = t.prodcode
        AND t.date >= '2004-01-01' 
        AND t.date <= '2004-01-31'
INNER JOIN transaction tt
        ON i.prodcode = tt.prodcode
        AND tt.date >= '2005-01-01' 
        AND tt.date <= '2005-01-31'
INNER JOIN customer c 
        ON c.custcode = t.custcode
        AND c.custcode = tt.custcode
WHERE i.basename is not NULL 
        and i.prodname is not NULL 
order by i.basename

This should give you a list of inventory basenames for all current 
customers (their names are still in the customer table) that "had 
transactions" (ordered products?) during both JAN 2004 and JAN 2005. This 
list will show only the products that were ordered during BOTH time 
periods BY THE SAME CUSTOMER at least once (at least one repeat sale, year 
to year, in JAN). Is this what you were after or was there a different 
question you were trying to answer?

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to