Verwenden innerer Verknüpfungen

Abgeschlossen

Der gängigste Typ von JOIN in T-SQL-Abfragen ist INNER JOIN. Innere Verknüpfungen werden verwendet, um viele gängige Geschäftsprobleme zu lösen, insbesondere in hochgradig normalisierten Datenbankumgebungen. Zum Abrufen von Daten, die in mehreren Tabellen gespeichert wurden, müssen Sie diese oft mithilfe von INNER JOIN-Abfragen kombinieren. INNER JOIN beginnt die logische Verarbeitungsphase als kartesisches Produkt, das dann gefiltert wird, um Zeilen zu entfernen, die nicht dem Prädikat entsprechen.

Verarbeiten von INNER JOIN-Abfragen

Im Folgenden werden die Schritte erläutert, die SQL Server ausführt, um eine JOIN-Abfrage logisch zu verarbeiten. Aus Gründen der Übersichtlichkeit werden im folgenden hypothetischen Beispiel Zeilennummern hinzugefügt:

1) SELECT emp.FirstName, ord.Amount
2) FROM HR.Employee AS emp 
3) JOIN Sales.SalesOrder AS ord
4)      ON emp.EmployeeID = ord.EmployeeID;

Wie Sie wissen, wird die FROM-Klausel vor der SELECT-Klausel verarbeitet. Im Folgenden wird die Verschlüsselung ab Zeile 2 aufgeschlüsselt:

  • Die FROM-Klausel legt die Tabelle HR.Employee als eine der Eingabetabellen fest und gibt ihr den Alias emp.
  • Der JOIN-Operator in Zeile 3 spiegelt die Verwendung von INNER JOIN (der Standardtyp in T-SQL) wider und gibt Sales.SalesOrder als andere Eingabetabelle mit dem Alias ord an.
  • SQL Server führt eine logische kartesische Verknüpfung dieser Tabellen durch und übergibt die Ergebnisse als virtuelle Tabelle an den nächsten Schritt. (Die physische Verarbeitung der Abfrage führt den Vorgang für das kartesische Produkt abhängig von den Entscheidungen des Optimierers möglicherweise nicht tatsächlich durch. Es kann jedoch hilfreich sein, sich die Erstellung des kartesischen Produkts vorzustellen.)
  • Mithilfe der ON-Klausel filtert SQL Server die virtuelle Tabelle und behält nur die Zeilen bei, in denen ein EmployeeID-Wert der emp-Tabelle mit einem EmployeeID-Wert in der ord-Tabelle übereinstimmt.
  • Die restlichen Zeilen verbleiben in der virtuellen Tabelle und werden an den nächsten Schritt in der SELECT-Anweisung übergeben. In diesem Beispiel wird als Nächstes die virtuelle Tabelle von der SELECT-Klausel verarbeitet, und die zwei festgelegten Spalten werden an die Clientanwendung zurückgegeben.

Das Ergebnis der abgeschlossenen Abfrage ist eine Liste der Mitarbeiter und deren Auftragssummen. Mitarbeiter, denen keine Aufträge zugeordnet sind, wurden wie alle Aufträge mit einem EmployeeID-Wert, der keinem Eintrag in der Tabelle HR.Employee entspricht, durch die ON-Klausel herausgefiltert.

Venn-Diagramm der übereinstimmenden Mitglieder der Mengen „Employee“ und „SalesOrder“

INNER JOIN-Syntax

INNER JOIN ist der Standardtyp von JOIN, und das optionale INNER-Schlüsselwort ist in der JOIN-Klausel implizit. Beim Kombinieren und Abgleichen von Verknüpfungstypen kann es hilfreich sein, den Verknüpfungstyp explizit festzulegen. Dies wird im folgenden Beispiel veranschaulicht:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp 
INNER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Beachten Sie beim Schreiben von Abfragen mit inneren Verknüpfungen die folgenden Richtlinien:

  • Tabellenaliase werden nicht nur für die SELECT-Liste bevorzugt, sondern auch zum Schreiben der ON-Klausel.
  • Innere Verknüpfungen können für eine einzelne übereinstimmende Spalte durchgeführt werden (z. B. eine OrderID-Spalte) oder für mehrere übereinstimmende Attribute (z. B. die Kombination von OrderID und ProductID). Verknüpfungen, die mehrere übereinstimmende Spalten angeben, werden als zusammengesetzte Verknüpfungen bezeichnet.
  • Die Reihenfolge, in der die Tabellen in der FROM-Klausel für INNER JOIN aufgeführt werden, ist für den SQL Server-Optimierer irrelevant. Konzeptionell werden Verknüpfungen von links nach rechts ausgewertet.
  • Verwenden Sie das JOIN-Schlüsselwort für jedes Paar verknüpfter Tabellen in der FROM-Liste einmal. Legen Sie für eine Abfrage für zwei Tabellen eine Verknüpfung fest. Bei Abfragen für drei Tabellen verwenden Sie JOIN zweimal: Einmal zwischen den ersten beiden Tabellen und nochmal zwischen der JOIN-Ausgabe zwischen den ersten beiden Tabellen und der dritten Tabelle.

INNER JOIN-Beispiele

Im folgenden Beispiel wird eine Verknüpfung für eine einzelne übereinstimmende Spalte durchgeführt, bei der ProductModelID in der Tabelle Production.Product mit ProductModelID in der Tabelle Production.ProductModel verglichen wird:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
ORDER BY p.ProductID;

Im nächsten Beispiel wird gezeigt, wie eine innere Verknüpfung erweitert werden kann, sodass sie mehr als zwei Tabellen enthält. Die Tabelle Sales.SalesOrderDetail wird mit der Ausgabe des JOIN-Vorgangs zwischen Production.Product und Production.ProductModel verknüpft. Jede Instanz von JOIN/ON führt eine eigene Auffüllung und Filterung der virtuellen Ausgabetabelle durch. Der SQL Server-Abfrageoptimierer bestimmt die Reihenfolge, in der Verknüpfungen und Filterungen durchgeführt werden.

SELECT od.SalesOrderID, m.Name AS Model, p.Name AS ProductName, od.OrderQty
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
INNER JOIN Sales.SalesOrderDetail AS od
    ON p.ProductID = od.ProductID
ORDER BY od.SalesOrderID;