Oracle 23ai New Feature: Group By und Having mit Alias
Überblick
In diesem Blogbeitrag wird eine Erweiterung der Klauseln GROUP BY und HAVING vorgestellt, die die Schreibarbeit minimiert und mit der es gelingt, den Aufwand nachträglicher Korrekturen an der SQL-Anweisung zu minimieren.
Diese Funktionalität wird auf einer Oracle Datenbank 23ai FREE demonstriert.
Ausgangssituation
Wenn eine Datenbankabfrage mit der Klausel GROUP BY (und ggf. HAVING) einen Ausdruck enthält, nach dem gruppiert werden muss, so war man bis Oracle 19c gezwungen, den Ausdruck in die jeweiligen Klauseln zu kopieren.
select d.department_name || ' (' || department_id || ')' as dept,
sum( salary) ssal
from employees e
join departments d using ( department_id)
group by
d.department_name || ' (' || department_id || ')'
order by
ssal desc;
DEPT SSAL
------------------------------------------------------------------------- ----------
Sales (80) 304500
Shipping (50) 156400
Executive (90) 58000
Finance (100) 51608
IT (60) 28800
Purchasing (30) 24900
Accounting (110) 20308
Marketing (20) 19000
Public Relations (70) 10000
Human Resources (40) 6500
Administration (10) 4400
11 rows selected.
Nachteile:
- Der Codeschnipsel "d.department_name || ' (' || department_id || ')'" muss 2x in der Anweisung vorhanden sein.
- Beide Codeschnipsel müssen zu 100% übereinstimmen, d. h. Änderungen sind stets 2x auszuführen (oder der Codeschnipsel ist erneut zu kopieren).
Folgende Anweisung ist z. B. fehlerhaft:
select d.department_name || '(' || department_id || ')' as dept,
sum( salary) ssal
from employees e
join departments d using ( department_id)
group by
d.department_name || ' (' || department_id || ')'
order by
dept;
ORA-00979: "D"."DEPARTMENT_NAME": must appear in the GROUP BY clause or be used in an aggregate function
00979. 00000 - "not a GROUP BY expression"
weil das Zeichenfolgeliteral mit der öffnenden Klammer einmal ein Leerzeichen und einmal keines enthält.
GROUP BY mit Alias in Oracle 23ai
In Oracle 23ai ist es jetzt möglich, für den Ausdruck einen Alias zu definieren und diesen in GROUP BY (und ggf. in HAVING) zu verwenden.
select d.department_name || ' (' || department_id || ')' as dept,
sum( salary) ssal
from employees e
join departments d using ( department_id)
group by
dept
order by
ssal desc;
DEPT SSAL
------------------------------------------------------------------------- ----------
Sales (80) 304500
Shipping (50) 156400
Executive (90) 58000
Finance (100) 51608
IT (60) 28800
Purchasing (30) 24900
Accounting (110) 20308
Marketing (20) 19000
Public Relations (70) 10000
Human Resources (40) 6500
Administration (10) 4400
11 rows selected.
Vorteile:
- Der Codeschnipsel "d.department_name || ' (' || department_id || ')'" wird nicht mehr kopiert, sondern referenziert - es ergibt sich ein geringerer Schreibaufwand.
- Die Fehlerquelle, dass im Fall einer Änderung am Ausdruck die Kopie des Ausdrucks nicht korrigiert wird, existiert nicht mehr.
Der Alias kann auch in der Klausel HAVING verwendet werden.
Zusammenfassung
Die Möglichkeit, Ausdrücke mit Aliasnamen zu versehen und diese in den Klauseln GROUP BY und HAVING zu verwenden, reduziert den Implementierungsaufwand und im Änderungsfall die Fehlerwahrscheinlichkeit und gehört zu den nützlichen Erweiterungen, die mit Oracle 23ai eingeführt wurden.
Kommentare
Keine Kommentare