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.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für