Datenschutz & Cookies
Diese Website verwendet cookies. Indem Sie fortfahren, stimmen Sie ihrer Verwendung zu. Erfahren Sie mehr, einschließlich der Kontrolle von Cookies.
Es gibt Zeiten, in denen ich SQL-Abfragen überprüfe und Personen finde, die LINKE ÄUßERE JOINs verwenden, aber dann WHERE Klauseln verwenden, die diese Joins in INNERE JOINs umwandeln. Kürzlich, als ich dies jemandem erwähnte, erinnerten sie mich daran, dass ich darüber bloggen sollte it…so hier blogge ich darüber. 🙂
Wenn Sie mit den verschiedenen JOINs nicht vertraut sind, lesen Sie diesen anderen SQL-Tipp, den ich geschrieben habe., Lassen Sie uns nun etwas mehr über den LINKEN ÄUßEREN JOIN lernen (ich beziehe mich von hier an einfach auf den LINKEN JOIN).
beginnen wir mit einigen Beispieldaten. Das Folgende kann am Anfang Ihrer eigenen Abfragen verwendet werden, wenn Sie diese Tests für sich selbst ausführen möchten. Wie Sie sehen, werden zwei Tabellen (Tabellenvariablen) erstellt.,
Wenn wir alle Datensätze in „Table1“ zurückgeben möchten, unabhängig davon, ob in „Table2“ ein zugeordneter Datensatz vorhanden ist, und die Daten von „Table2“ anzeigen möchten, wenn ein zugeordneter Datensatz vorhanden ist, schreiben wir einen LINKEN JOIN wie folgt:
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID;
Ausgabe:
Wenn wir der Abfrage jetzt eine WHERE Klausel hinzufügen möchten, um nur die Daten von „Table2“ abzurufen, wobei die ID ist weniger als 4, könnten wir so etwas tun:
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID < 4;
Ausgabe:
Aber…haben Sie gesehen, dass wir nur die Werte erhalten, bei denen in beiden Tabellen eine übereinstimmende ID vorhanden ist?, Hmmm…das scheint eine Menge wie ein innerer JOIN Recht zu handeln? Das ist, weil es ist. Glauben Sie mir nicht? Schauen Sie sich den Ausführungsplan an, nachdem Sie den LEFT JOIN mit und ohne WHERE Bedingung ausgeführt haben. Hier ist, was Sie sehen werden:
Wie können wir das umgehen? Nun, da Sie zunächst einen LEFT JOIN durchführen, müssen oder möchten Sie offensichtlich alle Datensätze von „Table1“ unabhängig von den Daten in „Table2″zurückgeben., Und wenn Sie wirklich keine Daten für bestimmte Datensätze in „Table2“ zurückgeben möchten, können Sie diese Datensätze in Ihrem JOIN-Prädikat herausfiltern (die ‚Suchkriterien‘ im EIN-Teil des JOINS). Zum Beispiel würde die letzte Abfrage stattdessen wie folgt geschrieben:
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID AND tb2.columnID < 4;
Ausgabe:
Sehen Sie, wie wir immer noch die 5 Datensätze von“ Table1 „erhalten, aber nicht die Daten von“ Table2″, die unsere Kriterien nicht erfüllen. Es werden nur Nullen für die Daten in dieser Tabelle zurückgegeben, die die Kriterien nicht erfüllen. Ziemlich genial, oder?,
Und…wir können uns den Ausführungsplan noch einmal ansehen, um zu beweisen, dass wir tatsächlich einen LEFT JOIN verwenden:
Was ist, wenn anstelle eines Werts stattdessen die IS NULL-Bedingung verwendet wird? Nun, in diesem Fall können Sie das in der WHERE Klausel verwenden.
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID IS NULL;
Ausgabe:
Und schauen wir uns den Ausführungsplan noch einmal an:
Beachten Sie, dass es den linken Join ausführt und dann die Daten für die NULL-Datensätze filtert? Das ist, was wir wollen, dass es zu tun und ehrlich gesagt, es ist, was wir wahrscheinlich erwartet, dass es zu tun.
Was ist, wenn wir stattdessen IS NOT NULL? Nun…das ist eine andere Geschichte., Ich werde die Überraschung verderben und Ihnen nur sagen, dass es einen INNEREN JOIN machen wird, genau wie es mit einem tatsächlichen Wert wäre. Wenn Sie mir nicht glauben, führen Sie die Abfrage selbst aus und sehen Sie sich den Ausführungsplan an.
Also, da hast du es; So kann ein LINKER JOIN tatsächlich ein LINKER JOIN sein oder auch nicht. Hoffentlich helfen Ihnen diese Informationen beim Schreiben besserer oder zumindest fundierterer Abfragen.