Hallo,
Ich habe ein "Produkt" und dazu eine "Lieferadresse" und eine "Rechnungsadresse". Daraus habe ich eine Tabelle "Produkt" und eine Tabelle "Adressen" gemacht. Nun möchte ich per SQL herausfinden, welche zwei Adressen zu einem Produkt gehören.
Wie baue ich die Beziehungen auf?
Produkt.Lieferadresse_ID <-> Adressen.ID
Produkt.Rechnungsadresse_ID <-> Adressen_ID
Wie sieht die Abfrage aus?
SELECT Produkt.Name, Adressen.Strasse(für Lieferung), Adressen.Strasse(für Rechnung)
Du greifst zweimal auf die Tabelle Adressen zu. Um die Zugriffe unterscheiden zu können, verwendest Du Aliasnamen:
Im ersten Schritt joinst Du die Lieferadressen zu Deinen Produkten:
SELECT
Produkt.Name,
Lieferung.Strasse AS [Strasse für Lieferung]
FROM
Produkt
INNER JOIN
Adressen AS Lieferung
ON
Produkt.Lieferadresse_ID = Lieferung.ID
Im zweiten Schritt betrachtest Du das Statement aus der ersten Abfrage als "Tabelle" und joinst die Tabelle Adressen für die Rechnung erneut dazu:
SELECT
Produkt.Name,
Lieferung.Strasse AS [Strasse für Lieferung],
Rechnung.Strasse AS [Strasse für Rechnung]
FROM
(Produkt
INNER JOIN
Adressen AS Lieferung
ON
Produkt.Lieferadresse_ID = Lieferung.ID)
INNER JOIN
Adressen AS Rechnung
ON
Produkt.Rechnungsadresse_ID = Rechnung.ID
Weitere Hinweise:
Da Du zwei INNER JOINs verwendest, ist die Reihenfolge der JOIN-Operationen im Prinzip gleichgültig. Soweit ich mich erinnere, will Jet-SQL (der SQL-Dialekt der DB-Engine hinter MS Access) explizite Klammerung der Ausdrücke. Bei OUTER JOINs läßt sich die Reihenfolge *nicht* einfach vertauschen, wie Du dem Artikel Fortgeschrittene Jointechniken entnehmen kannst.
Du kannst die Abfrage übrigens auch im Designer zusammenklicken. Dazu musst Du nur zweimal die Tabelle "Adressen" hinzufügen. Den Aliasnamen, den Access dabei vergibt, kannst Du in den Eigenschaften der Tabelle (im Abfragedesigner) ändern. Standardmäßig nimmt Access beim zweiten Hinzufügen einer Tabelle den Aliasnamen <Tabellenname>_1, beim dritten <Tabellenname>_2, ... Diese solltest Du auf alle Fälle durch aussagekräftige Aliasnamen ersetzen.
Freundliche Grüße
Vinzenz