Re: A subselect in an aggregate - Mailing list pgsql-sql

From Tom Lane
Subject Re: A subselect in an aggregate
Date
Msg-id 19423.962058706@sss.pgh.pa.us
Whole thread Raw
In response to Re: A subselect in an aggregate  ("Bryan White" <bryan@arcamax.com>)
List pgsql-sql
"Bryan White" <bryan@arcamax.com> writes:
> This is very slow (acutally I killed it after about 5 minutes):
> select o.date,sum(d.qty * d.price) from orderdetail d,orders o where o.date
> = '6/1/2000' group by o.date;

> This is quick (it takes a couple of seconds):
> select o.date,(select sum(od.qty * od.price) from orderdetail od where
> od.orderid = o.orderid) from orders o where o.date = '6/1/2000';

Well, they're not computing the same thing, are they?  Since there's no
constraint on d.orderid in the first example, you're asking for the sum
over ALL orderdetail records ... repeated over again for each order
record.  For equivalent constraints, I'd expect the first form to be
at least as fast as the second, probably faster.

> Which brings me back to the original question:  Is
> there a way to apply an aggregate function to a subselect?

Sure --- you just forgot that a sub-select expression requires its
very own parentheses, so you need two sets:sum((select ....))
But the other way is probably better...
        regards, tom lane


pgsql-sql by date:

Previous
From: "Bryan White"
Date:
Subject: Re: A subselect in an aggregate
Next
From: "Gary MacMinn"
Date:
Subject: Re: Merging two columns into one