web-dev-qa-db-de.com

Bedingte innere Verbindung

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)
22
KristianB

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

19
Sparky

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.

8
David
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 */
1
Tomalak

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.

0
ozzy432836