Re: JOINs against a subquery

From: Peter Nilsson <airia_at_acay.com.au>
Date: Wed, 26 Nov 2008 17:59:36 -0800 (PST)
Message-ID: <7dcfe76b-78d4-463b-b6d5-52d93f003a6b@y1g2000pra.googlegroups.com>


"Álvaro G. Vicario" <alvaroNOSPAMTHA..._at_demogracia.com> wrote:
> I have a pretty complicate query that produces a sales
> summary, ...

<snip>
> My worry is that I must be missing something basic about
> Oracle. An INNER JOIN works as expected and is almost as
> fast as the main query:
>
> SELECT sa.customer_id, sa.sales_amount, cu.full_name, cu.city
> FROM (
>         // Complicate inner query, returns only a few rows
> ) sa
> INNER JOIN customers cu ON sa.customer_id=cu.customer_id
>
> customer_id sales_amount full_name city
> =========== ============ ========= ======
>            1        99.95 Joe M.    Paris
>            3         1.25 Jack X.   London
>
> However, a LEFT JOIN takes years to run. The explain plan
> is completely different and has a cost that's more than
> ten times larger. So I cannot get this:
>
> customer_id sales_amount full_name city
> =========== ============ ========= ======
>            1        99.95 Joe M.    Paris
>            2       125.50 NULL      NULL
>            3         1.25 Jack X.   London
>
> I'd say the outer query would run after the inner query
> is completed but it doesn't seem to be the case.

Have you tried...

  select sa.customer_id,

         sa.sales_amount,
         (select cu.full_name from customers cu
           where cu.customer_id = sa.customer_id) full_name,
         (select cu.city from customers cu
           where cu.customer_id = sa.customer_id) city
    from (...complex...) sa

Although this is notionally slower, if the complex query is only returning a few rows, then it may work out quicker.

P.S. I'd be inclined to post the complex query.

--
Peter
Received on Wed Nov 26 2008 - 19:59:36 CST

Original text of this message