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:
Ich habe jetzt keine Ideen mehr, um den Trick zu machen.
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:
(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.
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.