From: | "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com> |
---|---|
To: | Tom Ellis <tom-postgresql(dot)org(at)jaguarpaw(dot)co(dot)uk> |
Cc: | "pgsql-general(at)lists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Why is it that “aggregate functions are not allowed in FROM clause of their own query level”? |
Date: | 2020-05-13 13:43:20 |
Message-ID: | CAKFQuwZeHu1BX+G++24O5wCPfXy+F9m9GAovrWqMguyUR1Y95g@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Wednesday, May 13, 2020, Tom Ellis <tom-postgresql(dot)org(at)jaguarpaw(dot)co(dot)uk>
wrote:
> Hello,
>
> The code under 1 gives me the error message "aggregate functions are
> not allowed in FROM clause of their own query level" whereas the code
> under 2 is permitted. Unless I am much mistaken the latter is
> equivalent to the former because it just makes a new "local" name for
> `v`.
>
https://www.postgresql.org/docs/12/sql-select.html
Because step 2 precedes step 4.
> A. Am I right in thinking that the two forms are equivalent?
In so far as if the first one could be executed it would provide the same
result, yes...i think
>
> A1. And am I right to presume that it's always possibly to rewrite
> more complicated examples that yield the same error to valid versions,
> just by coming up with a local name for the problematic fields?
Don’t feel like figuring out a counter-example, your given example is not
compelling enough
>
> B. If they are indeed equivalent, what is the rationale for forbidding
> the former? It seems like it would be more convenient to allow users
> to write the former form.
It wasn’t directly intentional. Lateral came long after from/group by.
But since it extends the from clause the processing order puts it before
aggregation.
> 1. Causes error:
>
> SELECT * FROM
> ((SELECT 0 as "v") as "T1"
> INNER JOIN LATERAL
> (SELECT
> SUM("v") as "r"
> FROM (SELECT 0) as "T1") as "T2"
> ON TRUE) as "T1"
>
> 2. Runs successfully
>
> SELECT * FROM
> ((SELECT 0 as "v") as "T1"
> INNER JOIN LATERAL
> (SELECT
> SUM("v_again") as "r"
> FROM (SELECT "v" as "v_again") as "T1") as "T2"
> ON TRUE) as "T1"
>
>
> By the way, the only reference to this issue that I can find on the
> entire internet is the following old mailing list post:
>
> https://www.postgresql.org/message-id/1375925710.17807.
> 13.camel%40vanquo.pezone.net
Yeah, because usually one just writes your example:
Select sum(“v”) from (select 0 as “v”) as t1 group by “v”;
> I also posted on DBA.StackExchange
> https://dba.stackexchange.com/questions/266988/why-is-it-
> that-aggregate-functions-are-not-allowed-in-from-clause-of-their-own
>
>
I did not.
David J.
From | Date | Subject | |
---|---|---|---|
Next Message | Gerard Weatherby | 2020-05-13 13:44:50 | Create user mapping for role |
Previous Message | Basques, Bob (CI-StPaul) | 2020-05-13 13:33:30 | RE: Enforcing uniqueness on [real estate/postal] addresses |