Zelfdeelnames gebruiken

Voltooid

Tot nu toe hebben de joins die we hebben gebruikt, verschillende tabellen betrokken. Er kunnen scenario's zijn waarin u rijen uit een tabel moet ophalen en vergelijken met andere rijen uit dezelfde tabel. In een human resources-toepassing kan een tabel Werknemer bijvoorbeeld informatie bevatten over de manager van elke werknemer en de id van de manager opslaan in de eigen rij van de werknemer. Elke manager wordt ook vermeld als werknemer.

EmployeeID

FirstName

ManagerID

1

Dan

NULL

2

Aisha

1

3

Rosie

1

4

Naomi

3

Als u de werknemersgegevens wilt ophalen en deze wilt koppelen aan de gerelateerde manager, kunt u de tabel twee keer in uw query gebruiken, waarbij deze wordt toegevoegd aan zichzelf voor de doeleinden van de query.

SELECT emp.FirstName AS Employee, 
       mgr.FirstName AS Manager
FROM HR.Employee AS emp
LEFT OUTER JOIN HR.Employee AS mgr
  ON emp.ManagerID = mgr.EmployeeID;

De resultaten van deze query bevatten een rij voor elke werknemer met de naam van hun manager. De CEO van het bedrijf heeft geen manager. Als u de CEO wilt opnemen in de resultaten, wordt een outer join gebruikt en wordt de naam van de manager geretourneerd als NULL voor rijen waar het veld ManagerID geen overeenkomend employeeID-veld heeft.

Werknemer

Manager

Dan

NULL

Aisha

Dan

Rosie

Dan

Naomi

Rosie

Er zijn andere scenario's waarin u rijen in een tabel wilt vergelijken met verschillende rijen in dezelfde tabel. Zoals u hebt gezien, is het vrij eenvoudig om kolommen in dezelfde rij te vergelijken met behulp van T-SQL, maar de methode om waarden uit verschillende rijen (zoals een rij met een begintijd op te slaan en een andere rij in dezelfde tabel waarin een bijbehorende stoptijd wordt opgeslagen) is minder duidelijk. Self-joins zijn een handige techniek voor dit type query's.

Als u taken zoals deze wilt uitvoeren, moet u rekening houden met de volgende richtlijnen:

  • Definieer twee exemplaren van dezelfde tabel in de FROM-component en voeg ze indien nodig samen met behulp van inner- of outer joins.
  • Gebruik tabelaliassen om onderscheid te maken tussen de twee exemplaren van dezelfde tabel.
  • Gebruik de COMPONENT ON om een filter te bieden waarmee kolommen van één exemplaar van de tabel worden vergeleken met kolommen uit het andere exemplaar van de tabel.