Använda självkopplingar

Slutförd

Hittills har kopplingarna som vi har använt involverat olika tabeller. Det kan finnas scenarier där du behöver hämta och jämföra rader från en tabell med andra rader från samma tabell. I ett personalprogram kan till exempel en anställd-tabell innehålla information om chefen för varje anställd och lagra chefens ID på den anställdes egen rad. Varje chef visas också som anställd.

EmployeeID

FirstName

ManagerID

1

Dan

NULL

2

Aisha

1

3

Rosie

1

4

Naomi

3

Om du vill hämta information om anställda och matcha den med den relaterade chefen kan du använda tabellen två gånger i frågan och koppla den till sig själv i frågans syfte.

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;

Resultatet av den här frågan innehåller en rad för varje anställd med namnet på sin chef. Bolagets VD har ingen chef. Om du vill inkludera VD:n i resultatet används en yttre koppling och chefsnamnet returneras som NULL för rader där fältet ManagerID inte har något matchande EmployeeID-fält .

Medarbetare

Ansvarig

Dan

NULL

Aisha

Dan

Rosie

Dan

Naomi

Rosie

Det finns andra scenarier där du vill jämföra rader i en tabell med olika rader i samma tabell. Som du har sett är det ganska enkelt att jämföra kolumner i samma rad med T-SQL, men metoden för att jämföra värden från olika rader (till exempel en rad som lagrar en starttid och en annan rad i samma tabell som lagrar motsvarande stopptid) är mindre uppenbar. Självkopplingar är en användbar teknik för dessa typer av frågor.

För att utföra uppgifter som detta bör du överväga följande riktlinjer:

  • Definiera två instanser av samma tabell i FROM-satsen och anslut dem efter behov med hjälp av inre eller yttre kopplingar.
  • Använd tabellalias för att särskilja de två instanserna av samma tabell.
  • Använd ON-satsen för att tillhandahålla ett filter som jämför kolumner i en instans av tabellen med kolumner från den andra instansen av tabellen.