On Wednesday, May 13, 2020, Tom Ellis <tom-postgresql....@jaguarpaw.co.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.