Wenn ich die Leistung außer Acht lasse, erhalte ich dann bei den folgenden Abfragen A und B dasselbe Ergebnis? Wie wäre es mit C und D?
-- A
select *
from a left join b
on <blahblah>
left join c
on <blahblan>
-- B
select *
from a left join c
on <blahblah>
left join b
on <blahblan>
-- C
select *
from a join b
on <blahblah>
join c
on <blahblan>
-- D
select *
from a join c
on <blahblah>
join b
on <blahblan>
Bei INNER
Joins spielt die Reihenfolge keine Rolle. Die Abfragen geben dieselben Ergebnisse zurück, solange Sie Ihre Auswahl von SELECT *
In SELECT a.*, b.*, c.*
Ändern.
Für (LEFT
, RIGHT
oder FULL
) OUTER
ist die Reihenfolge wichtig - und ( aktualisierte ) Dinge sind viel komplizierter.
Erstens sind äußere Verknüpfungen nicht kommutativ, daher ist a LEFT JOIN b
Nicht dasselbe wie b LEFT JOIN a
.
Äußere Verknüpfungen sind ebenfalls nicht assoziativ. In Ihren Beispielen, die beide Eigenschaften (Kommutativität und Assoziativität) umfassen, gilt Folgendes:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
entspricht:
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
aber:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
AND c.bc_id = b.bc_id
entspricht nicht:
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
AND b.bc_id = c.bc_id
Ein weiteres (hoffentlich einfacheres) Assoziativitätsbeispiel. Stellen Sie sich dies als (a LEFT JOIN b) LEFT JOIN c
Vor:
a LEFT JOIN b
ON b.ab_id = a.ab_id -- AB condition
LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
Dies ist äquivalent zu a LEFT JOIN (b LEFT JOIN c)
:
a LEFT JOIN
b LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
ON b.ab_id = a.ab_id -- AB condition
nur weil wir "Nice" ON
Bedingungen haben. Sowohl ON b.ab_id = a.ab_id
Als auch c.bc_id = b.bc_id
Sind Gleichheitsprüfungen und beinhalten keine NULL
Vergleiche.
Sie können sogar Bedingungen mit anderen Operatoren oder komplexeren Operatoren wie ON a.x <= b.x
Oder ON a.x = 7
Oder ON a.x LIKE b.x
Oder ON (a.x, a.y) = (b.x, b.y)
haben, und die beiden Abfragen wären immer noch gleichwertig .
Wenn jedoch eines dieser Elemente IS NULL
Oder eine mit Nullen verknüpfte Funktion wie COALESCE()
ist, z. B. wenn die Bedingung b.ab_id IS NULL
Lautet, sind die beiden Abfragen nicht gültig Äquivalent.
für reguläre Joins ist dies nicht der Fall. TableA join TableB
erstellt den gleichen Ausführungsplan wie TableB join TableA
(also wären deine C und D Beispiele gleich)
für left und right joins reicht es. TableA left Join TableB
ist anders als TableB left Join TableA
, ABER es ist dasselbe wie TableB right Join TableA
Wenn Sie versuchen, C auf einem Feld von B zu verbinden, bevor Sie B verbinden, d. H .:
SELECT A.x, A.y, A.z FROM A
INNER JOIN C
on B.x = C.x
INNER JOIN b
on A.x = B.x
ihre Anfrage wird fehlschlagen. In diesem Fall ist die Reihenfolge wichtig.
Oracle-Optimierer wählt die Verknüpfungsreihenfolge von Tabellen für die innere Verknüpfung. Optimierer wählt die Verknüpfungsreihenfolge von Tabellen nur in einfachen FROM-Klauseln. Sie können die Oracle-Dokumentation auf ihrer Website überprüfen. Und für die linke, rechte äußere Verknüpfung ist die am häufigsten gewählte Antwort die richtige. Der Optimierer wählt die optimale Verknüpfungsreihenfolge sowie den optimalen Index für jede Tabelle. Die Verknüpfungsreihenfolge kann sich darauf auswirken, welcher Index die beste Wahl ist. Das Optimierungsprogramm kann einen Index als Zugriffspfad für eine Tabelle auswählen, wenn es sich um die innere Tabelle handelt, nicht jedoch, wenn es sich um die äußere Tabelle handelt (und keine weiteren Qualifikationen vorliegen).
Der Optimierer wählt die Verknüpfungsreihenfolge von Tabellen nur in einfachen FROM-Klauseln. Die meisten Joins, die das JOIN-Schlüsselwort verwenden, werden zu einfachen Joins zusammengefasst, sodass das Optimierungsprogramm ihre Join-Reihenfolge auswählt.
Der Optimierer wählt die Verknüpfungsreihenfolge für äußere Verknüpfungen nicht aus; er verwendet die in der Anweisung angegebene Reihenfolge.
Bei der Auswahl einer Verknüpfungsreihenfolge berücksichtigt das Optimierungsprogramm Folgendes: Die Größe jeder Tabelle Die für jede Tabelle verfügbaren Indizes Ob ein Index für eine Tabelle in einer bestimmten Verknüpfungsreihenfolge nützlich ist Die Anzahl der Zeilen und Seiten, die für jede Tabelle in jeder Tabelle gescannt werden sollen mitbestellen