Mittwoch, Juli 06, 2011

Satzoperatoren und Duplikate

Ein Klassiker beim Schreiben schlechter SQL-Queries ist bekanntlich die Bildung von Joins mit unzureichenden Join-Bedingungen, die im Ergebnis Duplikate liefern, die dann wiederum durch DISTINCT unterdrückt werden. Dieser Tage habe ich gesehen, dass der Oracle Warehouse Builder (OWB) dazu noch eine andere Variante beisteuert (sofern es der OWB war und keine nachträgliche Anpassung durch einen Entwickler): nämlich die Bildung einer Menge mit Duplikaten, die dann über ein MINUS vereindeutigt wird. Zurückgeführt auf ein simples Beispiel geschah dabei Folgendes:

select mod(rownum, 3)
  from dual
connect by level < 10;

MOD(ROWNUM,3)
-------------
            1
            2
            0
            1
            2
            0
            1
            2
            0

9 Zeilen ausgewählt.

select mod(rownum, 3)
  from dual
connect by level < 10
minus
select 0 from dual;

MOD(ROWNUM,3)
-------------
            1
            2

Die Hauptquery lieferte aufgrund eines (nicht sinnvollen) 1:n-Joins Duplikate, die das MINUS als Satzoperation unterdrückte - bekanntlich liefert von den Satzoperationen nur UNION ALL doppelte Elemente in der Ergebnismenge (was möglicherweise daher kommt, dass die Mengenlehre keine Duplikate in Mengen vorsieht). Da ich nur den (ziemlich unübersichtlichen) Code des OWB gesehen habe und nicht die Darstellung in der GUI, kann ich auf Anhieb allerdings nicht sagen, ob diese Deduplizierung beabsichtigt war oder einfach geschehen ist.

Keine Kommentare:

Kommentar veröffentlichen