GROUP BY und ORA-00979 in 10gR2 und 11gR2

Aus der Rubrik „heute dazugelernt“: Oracle erlaubt es, mindestens seit 9iR2 (frühere Versionen habe ich nicht getestet), mehr Spalten in einer SELECT-Liste anzugeben, als später in der GROUP BY-Klausel verwendet werden.

Für Aggregatfunktionen wie COUNT(), SUM(), etc. ist das ja klar, es geht darüberhinaus aber auch mit

  1. Konstanten
  2. Ausdrücken, die für jede Zeile einer Gruppe denselben Wert liefern (also z.B. von einer der Spalten im GROUP BY abgeleitet sind).

Im folgenden Beispiel wenden wir auf die Spalte „created“ noch die NVL-Funktion an und führen diese Spalte nicht im GROUP BY auf. Das SQL läuft gemäß der Dokumentation problemlos durch.

-- Funktioniert in 9iR2 - 11gR2:
SQL> SELECT object_type, created, NVL(created, SYSDATE) cc, COUNT(*)
  2    FROM user_objects
  3   GROUP BY object_type, created;

keine Zeilen ausgewählt.

Nun verlegen wir dieses einfache Beispiel in eine Unterabfrage („Subquery“, „Inline View“). Auch das sollte dann eigentlich problemlos überall laufen — aber ab Oracle 11.2.0.1 will es das nicht mehr:

-- Funktioniert in 9iR2 - 10gR2:
SQL> SELECT object_type, created, cc, count(*)
  2    FROM ( SELECT object_type, NVL(created, SYSDATE) cc, created
  3           FROM user_objects )
  4   GROUP BY object_type, created;
keine Zeilen ausgewählt.

-- Aber nicht in 11gR2!
SQL> SELECT object_type, created, cc, count(*)
  2    FROM ( SELECT object_type, NVL(created, SYSDATE) cc, created
  3           FROM user_objects )
  4   GROUP BY object_type, created;
SELECT object_type, created, cc, count(*)
                             *
FEHLER in Zeile 1:
ORA-00979: Kein GROUP BY-Ausdruck

Ees handelt sich wahrscheinlich um eine Variante des Bugs # 10097965, für den zur Zeit noch keine Fix-Version genannt wird, nur dessen Base Bug 11657903 in Oracle 12.1 behoben sein soll. Ein möglicher Workaround ist das Setzen eines „hidden“ Parameters:

alter session set "_optimizer_distinct_agg_transform" = false;

Mit dem o.a. Beispiel funktioniert dieser Workaround jedoch nicht (getestet unter 11.2.0.2, HP-UX 11.31). Für andere Szenarien gibt allerdings positive Rückmeldungen.

Die Ursache für diesen Bug liegt wahrscheinlich im Fix für einen anderen Bug aus 10gR2, das die Restriktionen nicht korrekt umgesetzt hatte. So war es durchaus möglich, Pseudospalten zu erzeugen, die nicht einheitlich innerhalb einer Gruppe waren, womit ein GROUP BY potentiell fehlerhafte Ergebnisse erzeugen konnte.

Weblinks

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s