Left Join auf einer Tabelle mit Bedingung auf anderen Tabelle

9

Ich versuche, mehrere Tabellen zu verknüpfen und eine Klausel in der dritten Tabelle zu haben, wenn ich mich der zweiten anschließe. Ich habe mit where-Klauseln versucht, aber es gilt für das ganze Ergebnis, wenn ich nur die Spalten aus der zweiten Tabelle annullieren möchte.

Nehmen wir ein Beispiel, es wird klarer. Ich habe 4 Tabellen:

%Vor%

Die Tabelle B, die die Tabelle A mit den Tabellen C und D verbindet.

Beispieldaten sind:

%Vor%

Der direkte linke Join:

%Vor%

gibt die Daten zurück:

%Vor%

Was ich versuche ist, die B-Tabelle mit den Daten aus den C- und D-Tabellen zu filtern. Wenn ich einfach eine Where-Bedingung zu der Anfrage hinzufüge:

%Vor%

Es gibt zurück:

%Vor%

Was Logik ist, aber nicht was ich will. Was ich will ist:

%Vor%

Das hält eine Zeile mit dem A.ID = 2 , findet aber keinen Wert in B mit der übereinstimmenden Bedingung von C und D.

Ich habe versucht, die Bedingungen in der ON -Klausel in die C- und D-Tabellen einzufügen, aber die Daten von B behalten:

%Vor%

Ich habe jetzt keine Ideen mehr, um den Trick zu machen.

    
Pilou 23.03.2017, 10:01
quelle

3 Antworten

4

Was Sie tun müssen, sind die linken äußeren Joins von der b Tabelle zu den c und d Tabellen zuerst, und dann die äußere Verbindung, die zurück zur a Tabelle führt, wenn ein Wert entweder in der c oder d Bedingungen Spalten. Wie so:

%Vor%

(Danke an Alex Poole für das Erkennen der Probleme mit meiner bearbeiteten Ausgabe!)

ETA:

Dies könnte auch wie folgt geschrieben werden:

%Vor%

Das ist einfacher, aber möglicherweise schwerer zu entziffern (und daher in der Zukunft schwieriger zu pflegen). Ich habe es hier hinzugefügt, da ich keine Ahnung hatte, dass das eine gültige Syntax ist, und Sie könnten das Gefühl haben, dass es besser für Sie funktioniert.

    
Boneist 23.03.2017, 10:08
quelle
0

Ich füge eine andere Antwort hinzu, weil ich die vorherige wirklich als falsch entfernt habe. Ich denke, das ist die richtige Logik:

%Vor%

Das gibt die richtigen Ergebnisse zurück, wenn ich es teste.

Es ist ein interessantes Problem. Die Idee ist, Klammern zu verwenden, um den Vergleich zwischen A und B "zu verzögern". Dadurch kann die Bedingung auch feststellen, ob eine Übereinstimmung für C oder D vorhanden ist.

    
Gordon Linoff 23.03.2017 11:32
quelle
0

Tatsächlich habe ich einen anderen Weg gefunden, dies mit einer Unterabfrage in der ON -Klausel zu tun:

%Vor%

Ich weiß nicht, welche Lösung besser funktioniert, wenn sie eine andere Klausel in der A-Tabelle und große B-, C- und D-Tabellen hat.

    
Pilou 23.03.2017 14:03
quelle

Tags und Links