Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server-
U kunt een tabel aan zichzelf koppelen, zelfs als de tabel geen reflexieve relatie in de database heeft. U kunt bijvoorbeeld een self-join gebruiken om paren auteurs te vinden die in dezelfde stad wonen.
Net als bij elke join zijn ten minste twee tabellen vereist voor een self-join. Het verschil is dat u, in plaats van een tweede tabel toe te voegen aan de query, een tweede exemplaar van dezelfde tabel toevoegt. Op die manier kunt u een kolom in het eerste exemplaar van de tabel vergelijken met dezelfde kolom in het tweede exemplaar, waarmee u de waarden in een kolom met elkaar kunt vergelijken. Met de hulpmiddelen voor query's en weergaveontwerpers (Visual Database Tools) wordt een alias toegewezen aan het tweede exemplaar van de tabel.
Als u bijvoorbeeld een self-join maakt om alle paren auteurs in Berkeley te vinden, vergelijkt u de city kolom in het eerste exemplaar van de tabel met de city kolom in het tweede exemplaar. De resulterende query kan er als volgt uitzien:
SELECT authors.au_fname,
authors.au_lname,
authors1.au_fname AS Expr2,
authors1.au_lname AS Expr3
FROM authors
INNER JOIN authors AS authors1
ON authors.city = authors1.city
WHERE authors.city = 'Berkeley';
Voor het maken van een self-join zijn vaak meerdere joinvoorwaarden vereist. Bekijk het resultaat van de voorgaande query om te begrijpen waarom:
Cheryl Carson Cheryl Carson
Abraham Bennet Abraham Bennet
Cheryl Carson Abraham Bennet
Abraham Bennet Cheryl Carson
De eerste rij is nutteloos; Het geeft aan dat Cheryl Carson in dezelfde stad woont als Cheryl Carson. De tweede rij is even nutteloos. Als u deze nutteloze gegevens wilt elimineren, voegt u een andere voorwaarde toe die alleen die resultaatrijen behoudt waarin de twee auteursnamen verschillende auteurs beschrijven. De resulterende query kan er als volgt uitzien:
SELECT authors.au_fname,
authors.au_lname,
authors1.au_fname AS Expr2,
authors1.au_lname AS Expr3
FROM authors
INNER JOIN authors AS authors1
ON authors.city = authors1.city
AND authors.au_id <> authors1.au_id
WHERE authors.city = 'Berkeley';
De resultatenset is verbeterd:
Cheryl Carson Abraham Bennet
Abraham Bennet Cheryl Carson
Maar de twee resultaatrijen zijn overbodig. De eerste zegt dat Carson in dezelfde stad woont als Bennet, en de tweede zegt dat bennet in dezelfde stad woont als Carson. Als u deze redundantie wilt elimineren, kunt u de tweede joinvoorwaarde wijzigen van 'niet gelijk aan' in 'kleiner dan'. De resulterende query kan er als volgt uitzien:
SELECT authors.au_fname,
authors.au_lname,
authors1.au_fname AS Expr2,
authors1.au_lname AS Expr3
FROM authors
INNER JOIN authors AS authors1
ON authors.city = authors1.city
AND authors.au_id < authors1.au_id
WHERE authors.city = 'Berkeley';
De resultatenset ziet er als volgt uit:
Cheryl Carson Abraham Bennet
Handmatig een self-join maken
Voeg het tabel- of tabelwaardeobject waarmee u wilt werken toe aan het deelvenster Diagram (Visual Database Tools ).
Voeg dezelfde tabel opnieuw toe, zodat in het deelvenster Diagram twee keer hetzelfde tabel- of tabelwaardeobject wordt weergegeven.
De ontwerpfunctie voor query's en weergaven wijst een alias toe aan het tweede exemplaar door een volgnummer toe te voegen aan de tabelnaam. Bovendien maakt de ontwerpfunctie voor query's en weergaven een verbindingslijn tussen de twee exemplaren van de tabel of het tabelgebaseerde object in het deelvenster Diagram.
Klik met de rechtermuisknop op de joinlijn en kies Eigenschappen in het snelmenu.
Selecteer in het venster Eigenschappen de optie Voorwaarde samenvoegen en Type en selecteer het beletselteken (...) rechts van de eigenschap.
Wijzig in het dialoogvenster Join de vergelijkingsoperator tussen de primaire sleutels, indien nodig. U kunt de operator bijvoorbeeld wijzigen in minder dan (<).
Maak de aanvullende joinvoorwaarde (bijvoorbeeld authors.zip = authors1.zip) door de naam van de primaire joinkolom te slepen in het eerste exemplaar van het tabel- of tabelwaardeobject en neer te zetten op de bijbehorende kolom in het tweede exemplaar.
Geef andere opties op voor de query, zoals uitvoerkolommen, zoekvoorwaarden en sorteervolgorde.