Marco Wagner: INNER JOIN NULL PROBLEM mit GROUP

Hallo allerseits,

mein Problem ist ähnlich wie das typische Problem, dass auftritt wenn man einen INNER JOIN durchführt ohne OR ... IS NULL Abfrage. Dann werden die NULL Datensätze nicht angezeigt.

Problematischerweise funktioniert bei dem konkreten SQL String hier die OR ... IS NULL Abfrage nicht, weil die Gruppierung sonst durcheinander kommt (Gruppierung notwendig wegen dem COUNT)

Folgender SQL String liefert aller Ergebnisse richtig, nur falls IDKLASSIFIZIERUNG NULL ist werden diese Leistungen nicht geliefert und die sollen geliefert werden:

SELECT  VORGANG.IDLEISTUNG as Leistung,
 P_LEISTUNG_KLASSIFIZIERUNG.BEZEICHNUNG as Klassifizierung,
 COUNT(VORGANG.IDLEISTUNG) as COUNT_IDLEISTUNG
FROM  VORGANG,
 P_LEISTUNG_KLASSIFIZIERUNG
WHERE
 VORGANG.IDKLASSIFIZIERUNG=P_LEISTUNG_KLASSIFIZIERUNG.IDKLASSIFIZIERUNG

GROUP BY
 VORGANG.IDLEISTUNG,
 P_LEISTUNG_KLASSIFIZIERUNG.BEZEICHNUNG
ORDER BY
 VORGANG.IDLEISTUNG,
 Klassifizierung

Wie gesagt, bringt das Hinzufügen von OR VORGANG.IDKLASSIFIZIERUNG IS NULL leider nichts, weil er dann mit der Klassifizierungs-Gruppierung total durcheinander kommt. Ich wüsste keine Lösung mehr, außer die DB Tabellen zu ändern und NULL Werte rauszuschmeissen. Vielleicht ist ja hier jemand dabei der nen Tipp oder eine Lösung parat hat, so dass der SQL String mir die Lösung liefert.

Zur kurzen Erläuterung noch:
Es sind nur zwei Tabellen mit je zwei Spalten (+Testdaten):

a) VORGANG:
IDLEISTUNG, IDKLASSIFIZIERUNG
69, 1
69, 1
69, 1
69, 1
69, 2
69, 2
69, NULL
100, NULL

b) P_LEISTUNG_KLASSIFIZIERUNG:
IDKLASSIFIZIERUNG, BEZEICHNUNG
1, Sportlehrer
2, Arzt

d) Beispielausgabe
Leistung, Klassifizierung, Anzahl der Leistungen
69, NULL, 1
69, 1, 4
69, 2, 2
100, NULL

Alle Zeilen, wo die IDKLASSIFIZIERUNG NULL ist werden aber leider nicht ausgegeben.

Mit Besten Dank & Grüßen
-Marco Wagner-

  1. Hi Marco

    Dieses OR IS NULL solltest du allgemein nicht verwenden. Es gibt spezielle Join Syntax. Deine Version entspricht einem INNER JOIN:

    SELECT ...
      FROM tab1 INNER JOIN tab2 on (tab1.x = tab2.x)

    Du willst aber gar keinen INNER JOIN sondern einen OUTER JOIN, also auch NULL-Werte zulassen. Die Standard-Syntax dafür ist:

    SELECT ...
      FROM tab1 LEFT (OUTER) JOIN tab2 on (tab1.x = tab2.x)

    In diesem Fall erhälst du sämtliche Einträge von tab1 und dazu sämtliche ein passenden Einträge von tab2 oder NULL-Werte falls keiner existiert. Es gibt auch einen RIGHT JOIN (der nimmt dann alles von tab2 und passendes resp NULL von tab1) und einen FULL OUTER JOIN, der nimmt dann alles von tab1 und tab2, matcht zusammen und ergänzt wo nötig um NULL-Werte.

    Die genaue Schreibweise, insbesondere ob das Schlüsselwort OUTER benötigt wird oder nicht, hängt von deinem DBMS ab. Dazu solltest du also das Handbuch konsultieren. Sollte dein DBMS Oracle in einer sehr alten Version sein (afaik 7 und früher), ist die Syntax leider ganz anders.

    Gruss Daniela