hi
in allen Erklärungen zu SQL die ich kenne, ist immer so etwas erläutert:
Reihenfolge der Abarbeitung:
from - where - group by - having - select - order by - limit
aber in Postgres geht dies:
with tbase(id)
as (select 1 union all select 2)
select id otto from tbase
–where otto = 2
group by otto
–having otto = 2
order by otto
aber eigentlich ist “group by otto” gar nicht möglich (laut Abarbeitungsreihenfolge)
dies zeigt sich auch weil “having otto = 2” nicht geht.
In meinen Augen müsste entweder “group by otto” nicht funktionieren (das wäre ja Standard) oder wenn das schon erweitert wird, müsste auch “having otto = 2” gehen.
Was meinen die Fachleute hier?
hape
postgres=# with tbase(id)
as (select 1 union all select 2)
select id otto from tbase
where id = 2
group by otto
having id = 2
order by otto;
otto
------
2
(1 row)
postgres=#
Ich hab Dein SQL mal korrigiert, weil Du nicht im selben Level auf einen Alias (hier otto) zugreifen kannst. Wo exakt ist jetzt Dein Problem?
hi
vielen Dank für die Antwort. Ich verstehe nicht warum:
with tbase(id)
as (select 1 union all select 2)
select id otto from tbase
group by otto
order by otto
funktioniert da ja eigentlich der group by erst nach dme Select verarbeitet wird. Dies entspricht ja meiner Meinung nach nicht dem SQL Standard. Du schreibst ja auch beim having:
dies gilt aber eigentlich auch für den group by - wie kommt das, dass hier nicht die Abarbeitungsreihenfolge zieht?
hape
postgres=# with tbase(id)
as (select 1 union all select 2)
select id otto from tbase
where otto < 5 group by otto
order by otto;
ERROR: column "otto" does not exist
LINE 4: where otto < 5 group by otto
^
postgres=# with tbase(id)
as (select 1 union all select 2)
select id otto from tbase
where id < 5 group by otto
order by otto;
otto
------
1
2
(2 rows)
postgres=#
Ja, das war nicht ganz korrekt von mir. Du kannst nicht Im WHERE auf einen im selben Level definierten Alias zugreifen, weil es zum Zeitpunkt, wo WHERE wirkt, diesen Alias noch nicht gibt. Wenn GROUP BY und ORDER BY ausgeführt wird, hast Du aber schon ein Ergebnis mit diesem Spaltennamen.
hi
ich frag mal vorsichtig: wäre es nicht besser wenn das nicht geht bzw wenn das gehen soll auch having tut - wobei having ja auch ohne group by geht - das würde also ziemliche Folgen haben. Wisst ihr wo man sowas an die Entwickler weiterleiten kann (als Frage)?
hape
In strict SQL, GROUP BY can only group by columns of the source table but PostgreSQL extends this to also allow GROUP BY to group by columns in the select list.
Das wird sich auch nicht ändern, weil das ein Kompatibilitätsproblem wäre. Man muß das Feature ja nicht verwenden, wenn man es nicht mag.