Als u meerdere tabellen opneemt in een query, kunt u met behulp van joins de gewenste resultaten verkrijgen. Een join zorgt ervoor dat het queryresultaat alleen de gewenste records uit de gewenste tabellen bevat, op basis van de relaties tussen de tabellen in de query. Dit artikel bevat een beschrijving van joins, de verschillende jointypen en de wijze waarop u ze kunt gebruiken.
In dit artikel
Inleiding
Relationele databases bestaan in feite uit tabellen die logische relaties met elkaar hebben. Met behulp van relaties kunt u tabellen via overeenkomende velden met elkaar verbinden. Een relatie wordt in een query aangegeven door een join.
Als u tabellen aan een query toevoegt, worden er in Microsoft Office Access 2007 joins gemaakt op basis van de gedefinieerde relaties tussen de tabellen. Het is tevens mogelijk handmatig joins te maken in query's, ook als deze joins geen reeds gedefinieerde relaties vertegenwoordigen. Als u andere query's als gegevensbron voor een query gebruikt (in plaats van of naast tabellen), kunt u niet alleen joins tussen de bronquery's maken, maar ook tussen die query's en de eventuele tabellen die als gegevensbron worden gebruikt.
De werking van joins is vergelijkbaar met de werking van querycriteria in die zin dat er regels worden vastgelegd waaraan de gegevens moeten voldoen om te worden opgenomen in de querybewerkingen. In tegenstelling tot querycriteria, is bij joins tevens vastgelegd dat elk paar rijen dat voldoet aan de joinvoorwaarden in de recordset wordt gecombineerd in één rij.
Er zijn vier basistypen joins: inner joins, outer joins, cross joins en ongelijkwaardige joins. Dit artikel bevat informatie over elk type join dat u kunt gebruiken, de reden waarom u een bepaald type join zou gebruiken en de wijze waarop u de joins kunt maken.
Terug naar boven
Inner joins
Inner joins zijn het meest algemene type join. Een inner join 'vertelt' een query - op basis van de gegevens in de gekoppelde velden - dat rijen in de ene gekoppelde tabel corresponderen met rijen in de andere tabel. Wanneer een query met een inner join wordt uitgevoerd, worden alleen díe rijen in de querybewerkingen opgenomen die een overeenkomende waarde in beide gekoppelde tabellen hebben.
Waarom een inner join gebruiken?
U gebruikt een inner join als u alleen de rijen met het joinveld uit de beide tabellen wilt ophalen.
Hoe gebruik ik een inner join?
Meestal hoeft u niets te doen als u een inner join wilt gebruiken. Als u op een eerder tijdstip relaties tussen tabellen hebt gedefinieerd in het venster Relaties (venster Relaties: een objecttabblad waarin u relaties tussen tabellen en query's kunt bekijken, maken en wijzigen.), worden er automatisch inner joins gemaakt wanneer u gerelateerde tabellen toevoegt in de ontwerpweergave (ontwerpweergave: een weergave waarin het ontwerp wordt weergegeven van de volgende databaseobjecten: tabellen, query's, formulieren, rapporten en macro's. In de ontwerpweergave kunt u nieuwe databaseobjecten maken en het ontwerp van bestaande databaseobjecten wijzigen.) van de query. Als referentiële integriteit (referentiële integriteit: de regels die u hanteert om de bestaande relaties tussen tabellen in stand te houden wanneer u records toevoegt, bijwerkt of verwijdert.) is afgedwongen, staat er boven de joinlijn een '1' om aan te geven welke tabel zich aan de 'een'-kant van een een-op-veel-relatie (een-op-veel-relatie: een verbinding tussen twee tabellen waarbij de primaire-sleutelwaarde van elke record in de primaire tabel correspondeert met de waarde in een of meer overeenkomende velden van veel records in de gerelateerde tabel.) bevindt en een oneindigheidsteken (∞) om aan te geven welke tabel zich aan de 'veel'-kant bevindt.
Zelfs als u geen relaties hebt gedefinieerd, worden er automatisch inner joins gemaakt wanneer u twee tabellen toevoegt aan een query, op voorwaarde dat deze tabellen elk een veld bevatten met hetzelfde of een compatibel gegevenstype, en dat een van de joinvelden een primaire sleutel (primaire sleutel: een of meer velden (kolommen) waarvan de waarden elke record in de tabel uniek identificeren. Een primaire sleutel kan geen Null-waarden bevatten en heeft altijd een unieke index. Met een primaire sleutel relateert u een tabel aan refererende sleutels in andere tabellen.) is. De symbolen voor 'één' en 'veel' worden in dit geval niet weergegeven omdat referentiële integriteit niet wordt afgedwongen.
Als u query's aan uw query toevoegt en geen relaties tussen die query's hebt gedefinieerd, worden er niet automatisch inner joins gemaakt tussen die query's of tussen query's en tabellen. Meestal moet u deze zelf maken. U kunt een inner join maken door een veld van de ene gegevensbron naar een veld in een andere gegevensbron te slepen. Er wordt in Access een lijn weergegeven tussen de twee velden om aan te geven dat er een join is gemaakt.
SQL-syntaxis voor een inner join
Inner joins worden in SQL opgegeven in de FROM-component, zoals hierna wordt aangegeven:
FROM tabel1 INNER JOIN tabel2 ON tabel1.veld1 vlgopr tabel2.veld2
De bewerking INNER JOIN heeft de volgende argumenten:
| Argument |
Beschrijving |
| tabel1, tabel2 |
De naam van de tabellen waaruit records worden gecombineerd. |
| veld1, veld2 |
De namen van de velden die worden gekoppeld. Als de velden niet numeriek zijn, moet het gegevenstype (gegevenstype: het kenmerk van een veld dat bepaalt welk type gegevens daarin kunnen worden opgeslagen. Gegevenstypen zijn onder andere Booleaans, Integer, Lang, Valuta, Enkel, Dubbel, Datum, Reeks en Variant (standaardtype).) van de velden gelijk zijn en moeten ze hetzelfde soort gegevens bevatten. Ze hoeven echter niet dezelfde naam te hebben. |
| vglopr |
Een relationele vergelijkingsoperator: '=,' '<,' '>,' '<=,' '>=' of '<>.' |
Zie INNER JOIN, bewerking voor meer informatie over de syntaxis van de inner join.
Terug naar boven
Outer joins
Een outer join 'vertelt' een query dat hoewel sommige rijen aan beide zijden van de join exact met elkaar corresponderen, álle rijen uit de ene tabel in de query moeten worden opgenomen, evenals de rijen uit de andere tabel die aan beide zijden van de join een overeenkomende waarde hebben.
Outer joins kunnen left outer joins of right outer joins zijn. In een left outer join bevat de query alle rijen van de eerste tabel in de FROM-component van de SQL-instructies, en alleen die rijen uit de andere tabel waarvan het gekoppelde veld in beide tabellen dezelfde waarde bevat. In een right outer join bevat de query alle rijen uit de tweede tabel in de FROM-component van de SQL-instructie, en alleen die rijen uit de andere tabel waarvan het gekoppelde veld in beide tabellen dezelfde waarde bevat.
Opmerking Als u wilt weten welke tabel de linker- of de rechtertabel in een bepaalde join is, dubbelklikt u op de join en bekijkt u het dialoogvenster Joineigenschappen. U kunt ook naar de SQL-weergave schakelen en de FROM-component bekijken.
Sommige rijen aan de ene zijde van een outer join hebben geen corresponderende rijen in de andere tabel. Wanneer de rijen niet corresponderen, kunnen sommige velden die in het queryresultaat van die andere tabel worden weergegeven, leeg zijn.
Waarom een outer join gebruiken?
U gebruikt een outer join als u alle rijen uit een van de tabellen in de join wilt opnemen in uw resultaten en alleen die rijen uit de andere tabel waarvan het gekoppelde veld overeenkomt met de eerste tabel.
Hoe gebruik ik een outer join?
U maakt outer joins door inner joins te wijzigen.
Een inner join wijzigen in een outer join
- Dubbelklik in de ontwerpweergave van de query op de join die u wilt wijzigen.
Het dialoogvenster Joineigenschappen wordt geopend.
- Bekijk in het dialoogvenster Joineigenschappen de mogelijkheden naast optie 2 en optie 3.
- Klik op de gewenste optie en klik vervolgens op OK.
- De join wordt weergegeven en een pijl wijst van de gegevensbron waarvan alle rijen worden opgenomen, naar de gegevensbron waarvan alleen díe rijen worden opgenomen die voldoen aan de joinvoorwaarde.
SQL-syntaxis voor een outer join
Outer joins worden in SQL opgegeven in de FROM-component, zoals hierna wordt aangegeven:
FROM tabel1 [ LEFT | RIGHT ] JOIN tabel2
ON tabel1.veld1 vglopr tabel2.veld2
De bewerkingen LEFT JOIN en RIGHT JOIN hebben de volgende argumenten:
| Argument |
Beschrijving |
| tabel1, tabel2 |
De naam van de tabellen waaruit records worden gecombineerd. |
| veld1, veld2 |
De naam van de velden die worden samengevoegd. De velden moeten van hetzelfde gegevenstype (gegevenstype: het kenmerk van een veld dat bepaalt welk type gegevens daarin kunnen worden opgeslagen. Gegevenstypen zijn onder andere Booleaans, Integer, Lang, Valuta, Enkel, Dubbel, Datum, Reeks en Variant (standaardtype).) zijn en hetzelfde soort gegevens bevatten, maar ze hoeven niet dezelfde naam te hebben. |
| vglopr |
Een relationele vergelijkingsoperator: '=,' '<,' '>,' '<=,' '>=' of '<>.' |
Zie LEFT JOIN, bewerkingen voor meer informatie over de syntaxis van de outer join.
Terug naar boven
Cross joins
Cross joins wijken af van inner en outer joins in die zin dat ze niet expliciet in Office Access 2007 vertegenwoordigd zijn. In een cross join wordt elke rij uit de ene tabel gecombineerd met elke rij van een andere tabel, met als resultaat een zogenaamd kruisproduct of Cartesisch product. Elke keer wanneer u een query uitvoert met tabellen die niet expliciet gekoppeld zijn, is een kruisproduct het resultaat. Cross joins ontstaan meestal abusievelijk, maar ze kunnen in sommige gevallen bruikbaar zijn.
Waarom een cross join gebruiken?
Als u elke mogelijke combinatie van rijen tussen twee tabellen of query's wilt onderzoeken, gebruikt u een cross join. Stel dat uw bedrijf een fantastisch jaar heeft gehad en dat u overweegt uw klanten een korting te geven. U kunt een query samenstellen waarin de aankopen van elke klant worden opgeteld, een kleine tabel maken met verschillende mogelijke kortingspercentages en deze twee combineren in een andere query die een cross join uitvoert. Het resultaat is een query die een set hypothetische kortingen voor elke klant weergeeft.
Hoe gebruik ik een cross join?
Een cross join wordt gegenereerd als u tabellen of query's opneemt in uw query en niet ten minste één expliciete join voor elke tabel of query maakt. In Access wordt elke rij uit elke tabel of query die niet expliciet gekoppeld is aan een andere tabel of query, gecombineerd met elke andere rij in de resultaten. Denk nog maar eens aan het kortingsscenario uit de vorige alinea. Stel dat u 91 klanten hebt en dat u vijf mogelijke kortingspercentages wilt onderzoeken. Uw cross join produceert 455 rijen (het product van 91 en 5).
U kunt zich wellicht voorstellen dat abusievelijk geproduceerde cross joins enorme aantallen rijen in uw queryresultaat tot gevolg kunnen hebben. Bovendien zijn deze resultaten over het algemeen zinloos. Als het immers niet uw bedoeling was om elke rij daadwerkelijk met elke andere rij te combineren, hebben de meeste gecombineerde rijen die in de resultaten worden weergegeven geen enkele betekenis. Tot slot vergt de uitvoering van query's die onbedoelde cross joins produceren heel veel tijd.
Een onbedoelde cross join in de ontwerpweergave van de query

De omcirkelde velden moeten aan elkaar worden gekoppeld
Het kruisproduct dat het resultaat is van de hierboven afgebeelde onbedoelde cross join

Let op het grote aantal records
De resultaten nadat de correcte join is gemaakt

Het aantal records is veel kleiner
Terug naar boven
Ongelijkwaardige joins
Joins hoeven niet te zijn gebaseerd op de gelijkwaardigheid van de gekoppelde velden. Een join kan zijn gebaseerd op elke vergelijkingsoperator, bijvoorbeeld 'groter dan' (>), 'kleiner dan' (<) of 'niet gelijk aan' (<>). Joins die niet gebaseerd zijn op gelijkwaardigheid worden ongelijkwaardige joins genoemd.
Waarom een ongelijkwaardige join gebruiken?
Als u de rijen van twee gegevensbronnen wilt combineren op basis van veldwaarden die niet gelijk zijn, gebruikt u een ongelijkwaardige join. Ongelijkwaardige joins zijn meestal gebaseerd op de vergelijkingsoperator 'groter dan' (>), 'kleiner dan' (<), 'groter dan of gelijk aan' (>=) of 'kleiner dan of gelijk aan' (<=). Het resultaat van een ongelijkwaardige join die is gebaseerd op de operator 'niet gelijk aan' (<>) kan bijna net zoveel rijen als een cross join opleveren en de resultaten kunnen moeilijk te interpreteren zijn.
Hoe gebruik ik een ongelijkwaardige join?
Ongelijkwaardige joins worden niet ondersteund in de ontwerpweergave. U kunt een ongelijkwaardige join wel gebruiken in de SQL-weergave. Als u echter een join maakt in de ontwerpweergave, kunt u overschakelen naar de SQL-weergave en de vergelijkingsoperator 'is gelijk aan' (=) wijzigen in de gewenste operator. Hierna kunt u de query alleen opnieuw in de ontwerpweergave openen als u eerst de vergelijkingsoperator weer wijzigt in 'is gelijk aan' (=) in de SQL-weergave.
Terug naar boven
Een join verwijderen
Als u per ongeluk een join hebt gemaakt, bijvoorbeeld een join tussen twee velden met verschillende gegevenstypen, is het mogelijk deze join weer te verwijderen. Ga als volgt te werk om een join te verwijderen:
- Klik in het queryontwerpraster op de join die u wilt verwijderen.
- Druk op DELETE.
-of-
- Klik in het queryontwerpraster met de rechtermuisknop op de join die u wilt verwijderen en klik vervolgens op Verwijderen.
Terug naar boven