Re: A subselect in an aggregate
От | Tom Lane |
---|---|
Тема | Re: A subselect in an aggregate |
Дата | |
Msg-id | 19423.962058706@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | Re: A subselect in an aggregate ("Bryan White" <bryan@arcamax.com>) |
Список | 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 по дате отправления: