Inner joins gebruiken

Voltooid

Het meest voorkomende type JOIN in T-SQL-query's is INNER JOIN. Inner joins worden gebruikt om veel veelvoorkomende zakelijke problemen op te lossen, met name in zeer genormaliseerde databaseomgevingen. Als u gegevens wilt ophalen die zijn opgeslagen in meerdere tabellen, moet u deze vaak combineren via INNER JOIN-query's. Een INNER JOIN begint de logische verwerkingsfase als cartesisch product, dat vervolgens wordt gefilterd om rijen te verwijderen die niet overeenkomen met het predicaat.

Een INNER JOIN verwerken

Laten we eens kijken naar de stappen waarmee SQL Server een JOIN-query logisch verwerkt. Regelnummers in het volgende hypothetische voorbeeld worden ter duidelijkheid toegevoegd:

1) SELECT emp.FirstName, ord.Amount
2) FROM HR.Employee AS emp 
3) JOIN Sales.SalesOrder AS ord
4)      ON emp.EmployeeID = ord.EmployeeID;

Zoals u moet weten, wordt de FROM-component verwerkt vóór de SELECT-component. Laten we de verwerking volgen, beginnend met regel 2:

  • De FROM-component geeft de HR aan. Werknemertabel als een van de invoertabellen, waardoor deze de alias emp krijgt.
  • De JOIN-operator in regel 3 weerspiegelt het gebruik van een INNER JOIN (het standaardtype in T-SQL) en geeft Sales.SalesOrder op als de andere invoertabel, die een alias van ord heeft.
  • SQL Server voert een logische Cartesische join uit op deze tabellen en geeft de resultaten door als een virtuele tabel aan de volgende stap. (De fysieke verwerking van de query kan de cartesische productbewerking niet daadwerkelijk uitvoeren, afhankelijk van de beslissingen van de optimizer. Maar het kan handig zijn om zich voor te stellen dat het Cartesische product wordt gemaakt.)
  • Met behulp van de ON-component filtert SQL Server de virtuele tabel, waarbij alleen de rijen worden bewaard waarbij een EmployeeID-waarde uit de emp-tabel overeenkomt met een EmployeeID in de ord-tabel .
  • De resterende rijen blijven in de virtuele tabel staan en worden doorgegeven aan de volgende stap in de SELECT-instructie. In dit voorbeeld wordt de virtuele tabel vervolgens verwerkt door de SELECT-component en worden de twee opgegeven kolommen geretourneerd naar de clienttoepassing.

Het resultaat van de voltooide query is een lijst met werknemers en hun orderbedragen. Werknemers die geen gekoppelde orders hebben, zijn uitgefilterd door de ON-component, net zoals orders die een EmployeeID hebben die niet overeenkomt met een vermelding in de HR. Tabel Werknemer.

A Venn diagram showing the matching members of the Employee and SalesOrder sets

INNER JOIN-syntaxis

Een INNER JOIN is het standaardtype JOIN en het optionele INNER-trefwoord is impliciet in de JOIN-component. Bij het combineren en koppelen van jointypen kan het handig zijn om het jointype expliciet op te geven, zoals wordt weergegeven in dit hypothetische voorbeeld:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp 
INNER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Houd rekening met de volgende richtlijnen bij het schrijven van query's met behulp van inner joins:

  • Tabelaliassen hebben de voorkeur, niet alleen voor de SELECT-lijst, maar ook voor het schrijven van de ON-component.
  • Inner joins kunnen worden uitgevoerd op één overeenkomende kolom, zoals een OrderID, of op meerdere overeenkomende kenmerken, zoals de combinatie van OrderID en ProductID. Joins die meerdere overeenkomende kolommen opgeven, worden samengestelde joins genoemd.
  • De volgorde waarin tabellen worden vermeld in de FROM-component voor een INNER JOIN maakt niet uit voor de SQL Server-optimalisatie. Conceptueel worden joins geëvalueerd van links naar rechts.
  • Gebruik het trefwoord JOIN eenmaal voor elk paar gekoppelde tabellen in de FROM-lijst. Geef één join op voor een query met twee tabellen. Voor een query met drie tabellen gebruikt u JOIN twee keer; eenmaal tussen de eerste twee tabellen, en nogmaals tussen de uitvoer van de JOIN tussen de eerste twee tabellen en de derde tabel.

VOORBEELDEN VAN INNER JOIN

In het volgende hypothetische voorbeeld wordt een join uitgevoerd op één overeenkomende kolom, die de ProductModelID in de tabel Production.Product koppelt aan de ProductModelID in de tabel Production.ProductModel:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
ORDER BY p.ProductID;

In dit volgende voorbeeld ziet u hoe een inner join kan worden uitgebreid met meer dan twee tabellen. De tabel Sales.SalesOrderDetail is gekoppeld aan de uitvoer van de JOIN tussen Production.Product en Production.ProductModel. Elk exemplaar van JOIN/ON voert een eigen populatie uit en filtert de virtuele uitvoertabel. De sql Server-queryoptimalisatie bepaalt de volgorde waarin de joins en filters worden uitgevoerd.

SELECT od.SalesOrderID, m.Name AS Model, p.Name AS ProductName, od.OrderQty
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
INNER JOIN Sales.SalesOrderDetail AS od
    ON p.ProductID = od.ProductID
ORDER BY od.SalesOrderID;