CASE WHEN und INNER JOIN

  • Themenstarter Themenstarter vms01
  • Beginndatum Beginndatum
V

vms01

Hallo,


ich habe zwei Tabellen T und H. Eine davon ist eine Tabelle mit meinen Daten, die andere Tabelle ist eine Hilfstabelle.

Die Hilfstabelle H hat nur 2 Spalten: H.E1_E2 und H.Ersatz.

Die Tabelle T hat sehr viele Spalten aber unter anderem auch die Spalten E1 und E2.

Ich möchte nun eine View basteln, die alle Spalten von T hat, wobei die Spalten E1 und E2 mit Werten aus H.Ersatz ersetzt werden, falls T.E1 = H.E1_E2 und/ oder T.E2 = H.E1_E2.

Dabei sollen aber genausoviele Datensätze als Ergebnis geliefert werden, wie bei einem Select * FROM T.


Ich hoffe das ist einigermaßen verständlich.


Nun das Statement:


SQL:
SELECT   Spalte1, Spalte2, Spalte3 usw..,

CASE WHEN T.E1 = H.E1_E2 THEN H.Ersatz ELSE T.E1 END AS E1,

CASE WHEN T.E2 = H.E1_E2 THEN H.Ersatz ELSE T.E2 END AS E2,

FROM T LEFT OUTER JOIN H

ON T.E1 = H.E1_E2 OR ON T.E2 = H.E1_E2

Leider bekomme ich durch diesen LEFT OUTER JOIN und das OR jeweils einen Datensatz mehr sobald sowohl in T.E1 = H.E1_E2 UND T.E2 = H.E1_E2 etwas übereinstimmt. >>> Doppelte Datensätze.

Kann mir jemand etwas helfen, hab schon alles mögliche ausprobiert aber komme auf keine Lösung. DANKE.
 
Zuletzt bearbeitet von einem Moderator:
Zudem währe es gut zu wissen welche DB du verwendest. Soclhe Konstrukte können je nach DB anderst gehandelt werden müssen...
 
SQL:
SELECT   Spalte1, Spalte2, Spalte3 usw..,
CASE WHEN T.E1 = H.E1_E2 THEN H.Ersatz ELSE T.E1 END AS E1,
CASE WHEN T.E2 = H.E1_E2 THEN H.Ersatz ELSE T.E2 END AS E2,
FROM T LEFT OUTER JOIN H 
ON T.E1 = H.E1_E2  OR T.E2 = H.E1_E2

... ist kein Wunder, da die Einschränkung des kartesischen Produkts mit OR zwei Datensätze liefert.

Du musst die beiden OR-Teile voneinanderaussschließen können (also ein XOR), sonst klappt es nicht mit dem JOIN und doppelte Records tauchen auf.

SQL:
ON T.E1 = H.E1_E2  OR (T.E2 = H.E1_E2  AND (T.E1 <>  H.E1_E2 OR H.E1_E2 IS NULL)

Grüße
gore
 
Zuletzt bearbeitet von einem Moderator:
Danke für die schnelle Antwort.

Das klingt plausibel. Habe deinen Ansatz gerade getestet, bekomme aber immer noch doppelte Datensätze für T.E1 = H.E1_E2 UND T.E2 = H.E1_E2.

Ich habe genau einen Datensatz in dem T.E1 = H.E1_E2 UND T.E2 = H.E1_E2 zutrifft, der taucht dann doppelt auf. Wobei in der ersten Zeile nur T.E1 mit H.Erstatz ersetzt wird (in T.E2 steht noch dr alte Wert) und in der zweiten Zeile wird T.E2 mit H.Ersatz überschrieben in T.E1 steht der Ursprungswert.

Also immer noch doppelt und das CASE verhält sich komisch. Er müsste doch in beiden zeilen beide ändern, oder nicht?
 
Danke. Hat sich erledigt.

Man muss beim LEFT OUTER JOIN vor dem OR ein weiteres LEFT OUTER JOIN auf H setzen mit T.E2 = H2.Ersatz!! Das OR fällt dan weg!!
 
Zurück