die Interaktion der inneren und äußeren Verschlüsse in SQL
Komplexe SQL -Abfragen verwenden häufig mehrere Join -Operationen, wobei verschiedene Join -Typen kombiniert werden. Eine zentrale Überlegung ist, wie die Einbeziehung von Nullwerten, die eine Merkmal von äußeren Verknüpfungen bezeichnet, beeinflusst wird, wenn anschließend ein innerer Join angewendet wird.
Wie innere Anschlüsse die äußeren Join -Ergebnisse beeinflussen können
Ein innerer Join gibt von Natur aus nur Zeilen zurück, in denen der Join -Zustand in beide Tabellen erfüllt wird. Wenn ein innerer Join einem äußeren Join folgt und der Zustand des inneren Join auf Spalten beruht, die möglicherweise null sind (aufgrund des äußeren Join), filtert er effektiv Zeilen, bei denen diese Spalten null sind. Dies negiert die Einbeziehung von Nullwerten, die der äußere Join ursprünglich bereitgestellt hat.
.Illustratives Beispiel
Lassen Sie uns ein Szenario untersuchen:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN email ON person.email_id = email.id;
Die links join
stellt sicher, dass alle Zeilen aus der Tabelle person
enthalten sind, auch wenn es keinen passenden Eintrag in address
gibt. Die innere join
mit E -Mail
beschränkt dann die Ergebnisse nur auf diese Zeilen, in denen in beiden Person
und E -Mail
eine passende E -Mail_id
vorhanden sind. Zeiger von person
, die eine passende adress
hatte, aber ein null E -Mail_id
wird ausgeschlossen.
Ein problematisches Szenario und seine Lösung
Betrachten Sie diese Abfrage:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN city ON address.city_id = city.id;
hier, die innere join
mit City
nimmt an, dass adress.city_id
niemals null ist. Wenn einige Adressen eine City_id
fehlen, werden diese Zeilen (und assoziiert Person
Zeilen) weggelassen und ändern die Ergebnisse der initialen links join
.
Der korrekte Ansatz besteht darin, einen anderen join zu verwenden
anstelle der inneren join
:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
LEFT JOIN city ON address.city_id = city.id;
Dies bewahrt die Inklusivität der Initial links join
, die Fälle korrekt bearbeitet, wobei adress.city_id
null sein könnte. Dies stellt sicher, dass alle Person
Aufzeichnungen enthalten sind, unabhängig davon, ob sie eine Adresse oder eine Stadt haben.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3