SQL Reihenfolge der Abarbeitung in Postgres entspricht nicht dem Standard

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.

Ich glaube das ist eine Erweiterung zum Standard die Postgres zulässt. Auf die Schnelle konnte ich dazu allerdings nichts im Handbuch finden.

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

https://www.postgresql.org/list/

danke - sehr nett
hape

Das steht hier:

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.

1 „Gefällt mir“

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.