Erhalte ich unabhängig von der Leistung das gleiche Ergebnis aus Abfrage A und B unten? 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>
sql
join
relational-database
Nur ein Lernender
quelle
quelle
<blahblah>
? Verbinden Sie A mit B und A mit C oder verbinden Sie A mit B und B mit C?Antworten:
Bei
INNER
Joins spielt die Reihenfolge keine Rolle. Die Abfragen geben dieselben Ergebnisse zurück, solange Sie Ihre Auswahl vonSELECT *
in ändernSELECT a.*, b.*, c.*
.Für (
LEFT
,RIGHT
oderFULL
)OUTER
Joins ist die Reihenfolge wichtig - und ( aktualisierte ) Dinge sind viel komplizierter.Erstens sind äußere Verknüpfungen nicht kommutativ, also
a LEFT JOIN b
nicht dasselbe wieb LEFT JOIN a
Äußere Verknüpfungen sind ebenfalls nicht assoziativ. In Ihren Beispielen, die beide Eigenschaften (Kommutativität und Assoziativität) beinhalten:
ist äquivalent zu :
aber:
ist nicht gleichbedeutend mit :
Ein weiteres (hoffentlich einfacheres) Assoziativitätsbeispiel. Stellen Sie sich das vor als
(a LEFT JOIN b) LEFT JOIN c
:Dies ist gleichbedeutend zu
a LEFT JOIN (b LEFT JOIN c)
:nur weil wir "schöne"
ON
Bedingungen haben. BeideON b.ab_id = a.ab_id
undc.bc_id = b.bc_id
sind Gleichstellungsprüfungen und beinhalten keineNULL
Vergleiche.Sie können sogar Bedingungen mit anderen oder komplexeren Operatoren wie:
ON a.x <= b.x
oderON a.x = 7
oderON a.x LIKE b.x
oder haben,ON (a.x, a.y) = (b.x, b.y)
und die beiden Abfragen wären immer noch gleichwertig.Wenn jedoch eine dieser
IS NULL
Funktionen oder eine Funktion, die sich auf Nullen bezieht, wieCOALESCE()
z. B. wenn die Bedingung erfüllt istb.ab_id IS NULL
, sind die beiden Abfragen nicht gleichwertig.quelle
a.somecol > 0 OR b.someothercol > 0
; Die Assoziativität könnte für diese Bedingung fehlschlagen.INNER JOIN
und eine folgeLEFT JOIN
. Funktioniert es so, dass zuerst die AbfrageFilter
die Datensätze auf der Basis vonINNER JOIN
und dannLEFT JOIN
auf dieFiltered
Datensätze angewendet wird?ON
Klausel (dh die „Join - Spezifikation“) an einen neuen Standort . Dies ist jedoch nur die Syntax. Wenn Sie die relationale Algebra-Notation verwenden (wobei die Join-Spezifikation unter dem Join-Operator steht), wird die Assoziativität deutlicher. Ihr Argument zeigt nur, dass äußere Verknüpfungen nicht kommutativ sind , was richtig istBei regulären Joins ist dies nicht der Fall.
TableA join TableB
erstellt den gleichen Ausführungsplan wieTableB join TableA
(Ihre C- und D-Beispiele wären also dieselben)für links und rechts verbindet es.
TableA left Join TableB
ist anders alsTableB left Join TableA
, ABER es ist das gleiche alsTableB right Join TableA
quelle
Wenn Sie versuchen, C auf einem Feld von B aus zu verbinden, bevor Sie B beitreten, dh:
Ihre Abfrage schlägt fehl. In diesem Fall ist die Reihenfolge von Bedeutung.
quelle
Oracle-Optimierer wählt die Verknüpfungsreihenfolge der Tabellen für die innere Verknüpfung. Das Optimierungsprogramm wählt die Verknüpfungsreihenfolge von Tabellen nur in einfachen FROM-Klauseln aus. Sie können die Orakel-Dokumentation auf ihrer Website überprüfen. Und für den linken, rechten äußeren Join ist die am häufigsten gewählte Antwort richtig. 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 es keine weiteren Qualifikationen gibt).
Das Optimierungsprogramm wählt die Verknüpfungsreihenfolge von Tabellen nur in einfachen FROM-Klauseln aus. Die meisten Verknüpfungen, die das Schlüsselwort JOIN verwenden, werden in einfache Verknüpfungen reduziert, sodass das Optimierungsprogramm die Verknüpfungsreihenfolge auswählt.
Das Optimierungsprogramm wählt nicht die Verknüpfungsreihenfolge für äußere Verknüpfungen aus. Es verwendet die in der Anweisung angegebene Reihenfolge.
Bei der Auswahl einer Verknüpfungsreihenfolge berücksichtigt das Optimierungsprogramm: 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 Beitrittsreihenfolge
quelle