Ich möchte in der Lage sein, zwei Tabellen basierend auf dem Ergebnis eines Ausdrucks zu verbinden.
Was ich bisher versucht habe:
INNER JOIN CASE WHEN RegT.Type = 1 THEN TimeRegistration ELSE DrivingRegistration AS RReg
ON
RReg.RegistreringsId = R.Id
RegT ist ein Join, den ich kurz vor diesem Join gemacht habe:
INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id
Dieses SQL-Skript funktioniert nicht.
Alles in allem also, wenn Type
den Wert 1 hat, sollte sie in die Tabelle TimeRegistration
aufgenommen werden, ansonsten wird DrivingRegistration
eingebunden.
Lösung:
In meiner select-Anweisung habe ich folgende Verknüpfungen ausgeführt:
INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id
LEFT OUTER JOIN TimeRegistration AS TReg ON TReg.RegistreringsId = R.Id AND RegT.Type = 1
LEFT OUTER JOIN DrivingRegistration AS DReg ON DReg.RegistreringsId = R.Id AND RegT.Type <>1
Dann bearbeitete ich meinen where-clause
so, dass je nach RegType
das richtige ausgegeben wird:
WHERE (CASE RegT.Type WHEN 1 THEN TReg.RegistreringsId ELSE DReg.RegistreringsId END = R.Id)
Versuchen Sie, beide Tabellen mit LEFT JOIN in die Abfrage einzufügen
LEFT JOIN TimeRegistration TR ON r.rid = TR.Id AND RegT.type =1
LEFT JOIN DrivingRegistration DR ON r.rid = DR.Id AND RegT.type <>1
Verwenden Sie nun in der select-Klausel
CASE RegType.Type WHEN 1 THEN TR.SomeField ELSE DR.someField END as SomeField
Die andere Option ist die Verwendung von dynamischem SQL
Sie müssen wahrscheinlich zwei linke Joins ausführen, einen für TimeRegistration
und einen für DrivingRegistration
, und die gewünschten Felder aus der entsprechenden Join-Tabelle zurückgeben.
LEFT JOIN TimeRegistration ON TimeRegistration.RegistreringsId = R.Id
LEFT JOIN DrivingRegistration ON DrivingRegistration.RegistreringsId = R.Id
und Sie wählen Aussage aus, wäre etwa so:
SELECT CASE WHEN RegT.Type = 1 THEN TimeRegistration.Foo ELSE DrivingRegistration.Bar END
Ich mag das, was Sie versuchen, aber ich glaube nicht, dass SQL so clever ist.
SELECT
R.foo, tr.bar
FROM
SomeTable AS R
INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id
AND RegT1.Type = 1
INNER JOIN TimeRegistration AS tr ON /* whatever */
UNION
SELECT
R.foo, dr.bar
FROM
SomeTable AS R
INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id
AND RegT1.Type = 2
INNER JOIN DrivingRegistration AS dr ON /* whatever */
Ich hatte also ein Szenario, in dem sich drei E-Mail-Spalten in einer Tabelle befanden (fragen Sie nicht nach dem Grund), und eine davon könnte null (oder leer) sein. In diesem Beispielcode werde ich mich nur mit einem Fall befassen, in dem es null ist.
Ich musste es in einer beliebigen E-Mail an eine andere Tabelle anschließen, um den Vornamen des Benutzers abzurufen.
Hier ist, was funktioniert hat
select
m.email1,
m.email2,
m.email3,
m2.firstName
from MyTable m
left join MyOtherTable m2 on m2.Email =
case when m.email1 is null then
case when m.email2 is null then
case when m.email3 null then
'[email protected]' -- i stopped here
else m.email3 end
else wm.email2 end
else m.email1 end
Natürlich würden Sie gerne weitere Bedingungen angeben
case when m.email1 is null or m.email1 = '' then ...
Um leere Werte zu erfassen.