web-dev-qa-db-de.com

Ist die Join-Reihenfolge in SQL von Bedeutung?

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>  
162
Just a learner

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.

200
ypercubeᵀᴹ

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

4
Diego

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.

0
Teo J.

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

0
Saumyojit Das