1. Start
  2. Unternehmen
  3. Blog
  4. Oracle 23ai New Feature: Group By und Having mit Alias

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

Kommentar schreiben

* Diese Felder sind erforderlich