Durchführen von Joins mit SQL-Anweisungen in Access

In einem relationalen Datenbanksystem wie Access müssen Sie häufig Informationen aus mehreren Tabellen gleichzeitig extrahieren. Hierzu können Sie eine SQL-JOIN-Anweisung verwenden, mit der Sie Datensätze aus Tabellen abrufen können, für die Beziehungen definiert sind, unabhängig davon, ob es 1:1-, 1: n- oder m:n-Beziehungen sind.

INNER JOINs

Der INNER JOIN (innerr Join), auch bekannt als Gleichheitsverknüpfung, ist der am häufigsten verwendete Join-Typ. Dieser Join dient zum Abrufen von Zeilen aus mindestens zwei Tabellen durch Vergleichen eines Feldwerts, der den Tabellen gemeinsam ist. The fields you join on must have similar data types, and you cannot join on MEMO or OLEOBJECT data types.

To build an INNER JOIN statement, use the INNER JOIN keywords in the FROM clause of a SELECT statement.

In diesem Beispiel wird die INNER JOIN-Anweisung verwendet, um ein Resultset aller Kunden zu erstellen, für die Rechnungen vorliegen, zusätzlich zu den Daten und Beträgen dieser Rechnungen.

SELECT [Last Name], InvoiceDate, Amount 
   FROM tblCustomers INNER JOIN tblInvoices 
   ON tblCustomers.CustomerID=tblInvoices.CustomerID 
   ORDER BY InvoiceDate 

Beachten Sie, dass die Tabellennamen durch die Schlüsselwörter INNER JOIN getrennt werden und dass der relationale Vergleich nach dem Schlüsselwort ON durchgeführt wird. Für die relationalen Vergleiche können Sie auch die <Operatoren , >, =<, >= oder <> verwenden, und Sie können auch die BETWEEN-Schlüsselwort (keyword) verwenden. Beachten Sie außerdem, dass die ID-Felder aus beiden Tabellen nur im relationalen Vergleich verwendet werden. Sie sind nicht Teil des endgültigen Resultset.

Um die SELECT-Anweisung weiter zu qualifizieren, können Sie eine WHERE-Klausel nach dem Join-Vergleich in der ON-Klausel verwenden.

Im folgende Beispiel wird das Resultset so eingeschränkt, dass nur Rechnungen mit Datum nach dem 1. Januar 1998 enthalten sind.

SELECT [Last Name], InvoiceDate, Amount 
   FROM tblCustomers INNER JOIN tblInvoices 
   ON tblCustomers.CustomerID=tblInvoices.CustomerID 
   WHERE tblInvoices.InvoiceDate > #01/01/1998# 
   ORDER BY InvoiceDate 

Wenn Sie mehrere Tabellen verknüpfen müssen, können Sie die INNER JOIN-Klauseln schachteln. Das folgende Beispiel baut auf einer vorherigen SELECT-Anweisung auf, um das Resultset zu erstellen, enthält jedoch auch den Ort und das Bundesland für jeden Kunden, indem die INNER JOIN-Anweisung für die Tabelle „tblShipping“ hinzugefügt wird.

SELECT [Last Name], InvoiceDate, Amount, City, State 
   FROM (tblCustomers INNER JOIN tblInvoices 
   ON tblCustomers.CustomerID=tblInvoices.CustomerID) 
      INNER JOIN tblShipping 
      ON tblCustomers.CustomerID=tblShipping.CustomerID 
   ORDER BY InvoiceDate 

Beachten Sie, dass die erste JOIN-Klausel in Klammern eingeschlossen ist, um sie logisch von der zweiten JOIN-Klausel zu trennen. Es ist auch möglich, eine Tabelle mit sich selbst zu verbinden, indem ein Alias für den zweiten Tabellennamen in der FROM-Klausel verwendet wird. Angenommen, Sie möchten alle Kundendatensätze mit doppelten Nachnamen suchen. Dazu müssen Sie den Alias "A" für die zweite Tabelle erstellen und nach unterschiedlichen Vornamen suchen.

SELECT tblCustomers.[Last Name], 
   tblCustomers.[First Name] 
   FROM tblCustomers INNER JOIN tblCustomers AS A 
   ON tblCustomers.[Last Name]=A.[Last Name] 
   WHERE tblCustomers.[First Name]<>A.[First Name] 
   ORDER BY tblCustomers.[Last Name] 

OUTER JOINs

Ein OUTER JOIN (äußerer Join) wird verwendet, um Datensätze aus mehreren Tabellen abzurufen und dabei Datensätze aus einer der Tabellen beizubehalten, auch wenn die andere Tabellen keinen übereinstimmenden Datensatz enthält. Das Access-Datenbankmodul unterstützt zwei Arten von OUTER JOINs: LEFT OUTER JOINs (linke äußere Joins) und RIGHT OUTER JOINs (rechte äußere Joins).

Think of two tables that are beside each other, a table on the left and a table on the right. Der LEFT OUTER JOIN wählt alle Zeilen in der rechten Tabelle aus, die den relationalen Vergleichskriterien entsprechen, und wählt auch alle Zeilen aus der linken Tabelle aus, auch wenn in der rechten Tabelle keine Übereinstimmung vorhanden ist. The RIGHT OUTER JOIN is simply the reverse of the LEFT OUTER JOIN; all rows in the right table are preserved instead.

Nehmen Sie als Beispiel an, dass Sie für jeden Kunden den gesamten berechneten Betrag bestimmen möchten, wenn der Kunde jedoch über keine Rechnungen verfügt, soll dies durch das Wort "NONE" angezeigt werden

SELECT [Last Name] & ', ' &  [First Name] AS Name, 
   IIF(Sum(Amount) IS NULL,'NONE',Sum(Amount)) AS Total 
   FROM tblCustomers LEFT OUTER JOIN tblInvoices 
   ON tblCustomers.CustomerID=tblInvoices.CustomerID 
   GROUP BY [Last Name] & ', ' &  [First Name] 

In der vorherigen SQL-Anweisung geschehen mehrere Dinge. Zuerst wird der Zeichenfolgenverkettungsoperator „&“ verwendet. Mit diesem Operator können Sie zwei oder mehr Felder zu einer Textzeichenfolge verknüpfen. Dann wird mit der immediate if (IIf)-Anweisung überprüft, ob die Summe null ist. Wenn dies der Grund ist, gibt die Anweisung das Wort "NONE" zurück. Wenn die Summe nicht NULL ist, wird der Wert zurückgegeben. Zuletzt wird die OUTER JOIN-Klausel verwendet. Die Verwendung von LEFT OUTER JOIN behält die Zeilen in der linken Tabelle bei, sodass alle Kunden angezeigt werden, auch diejenigen, die keine Rechnungen haben.

OUTER JOINs können in einer Verknüpfung mehrerer Tabellen in INNER JOINs geschachtelt werden, jedoch können INNER JOINs nicht in OUTER JOINs geschachtelt werden.

Das kartesische Produkt

Ein Ausdruck, der häufig im Zusammenhang mit Joins verwendet wird, ist das kartesische Produkt. Ein kartesisches Produkt wird als "alle möglichen Kombinationen aller Zeilen in allen Tabellen" definiert. Wenn Sie z. B. zwei Tabellen ohne qualifikations- oder verknüpfungstyp verknüpfen würden, erhalten Sie ein kartesisches Produkt.

SELECT * 
   FROM tblCustomers, tblInvoices 

Dies wäre nicht empfehlenswert, besonders in Tabellen mit Hunderten oder Tausenden von Zeilen. Das Erstellen von kartesischen Produkten sollte durch stetes Bezeichnen der Verknüpfungen vermieden werden.

Der UNION-Operator

Obwohl der UNION-Operator, auch bekannt als Vereinigungsabfrage, technisch gesehen kein Join ist, wird er hier aufgeführt, da auch mit ihm Daten aus mehreren Datenquellen zu einem Resultset kombiniert werden, ähnlich wie bei einigen Join-Typen. Der UNION-Operator wird verwendet, um Daten aus Tabellen, SELECT-Anweisungen oder Abfragen zu kombinieren und dabei alle doppelten Zeilen auszulassen. Beide Datenquellen müssen dieselbe Anzahl von Feldern aufweisen, die Felder müssen jedoch nicht denselben Datentyp aufweisen. Angenommen, Sie haben eine Tabelle „Employees“, die dieselbe Struktur hat wie die Tabelle „Customer“, und Sie möchten eine Liste von Namen und E-Mail-Adressen erstellen, indem Sie die beiden Tabellen kombinieren.

SELECT [Last Name], [First Name], Email 
   FROM tblCustomers 
UNION 
SELECT [Last Name], [First Name], Email 
   FROM tblEmployees 

Um alle Felder aus beiden Tabellen abzurufen, können Sie das Schlüsselwort TABLE wie folgt verwenden.

TABLE tblCustomers 
UNION 
TABLE tblEmployees 

Der UNION-Operator zeigt keine Datensätze an, die genaue Duplikate in beiden Tabellen sind. Dies kann jedoch wie folgt überschrieben werden, indem das Prädikat ALL nach dem Schlüsselwort UNION eingefügt wird:

SELECT [Last Name], [First Name], Email 
   FROM tblCustomers 
UNION ALL 
SELECT [Last Name], [First Name], Email 
   FROM tblEmployees 

Die TRANSFORM-Anweisung

Obwohl die TRANSFORM-Anweisung, auch bekannt als Kreuztabellenabfrage, technisch gesehen kein Join ist, wird sie hier aufgeführt, da auch mit ihr Daten aus mehreren Datenquellen zu einem Resultset kombiniert werden, ähnlich wie bei einigen Join-Typen.

Eine TRANSFORM-Anweisung wird zum Berechnen eine Summe, eines Durchschnitts, einer Anzahl oder einer andere Art von Gesamtsumme für Datensätze verwendet. Anschließend zeigt sie die Informationen in einem Raster- oder Kalkulationstabellenformat an, in dem Daten sowohl vertikal (Zeilen) als auch horizontal (Spalten) gruppiert sind. Das allgemeine Format einer TRANSFORM-Anweisung sieht folgendermaßen aus.

   TRANSFORM aggregating function 
   SELECT statement 
   PIVOT column heading field 

Ein Beispielszenario: Sie möchten ein Datenblatt erstellen, das die jährlichen Rechnungssummen für jeden Kunden angezeigt. Die vertikalen Überschriften sind die Kundennamen, und die horizontalen Überschriften sind die Jahre. Sie können eine vorherige SQL-Anweisung ändern, um die Transform-Anweisung aufzunehmen.

TRANSFORM 
IIF(Sum([Amount]) IS NULL,'NONE',Sum([Amount])) 
   AS Total 
SELECT [Last Name] & ', ' & [First Name] AS Name 
      FROM tblCustomers LEFT JOIN tblInvoices 
      ON tblCustomers.CustomerID=tblInvoices.CustomerID 
      GROUP BY [Last Name] & ', ' & [First Name] 
PIVOT Format(InvoiceDate, 'yyyy') 
   IN ('1996','1997','1998','1999','2000') 

Beachten Sie Folgendes: Die Aggregatfunktion ist die Sum-Funktion, die vertikalen Überschriften befinden sich in der GROUP BY-Klausel der SELECT-Anweisung, und die horizontalen Überschriften werden durch die nach dem Schlüsselwort PIVOT aufgelisteten Felder bestimmt.

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.