Belső illesztések használata

Befejeződött

A T-SQL-lekérdezésekben a JOIN leggyakoribb típusa az INNER JOIN. A belső illesztések számos gyakori üzleti probléma megoldására szolgálnak, különösen a nagymértékben normalizált adatbázis-környezetekben. A több táblában tárolt adatok lekéréséhez gyakran inner JOIN lekérdezésekkel kell kombinálnia őket. Az INNER JOIN cartesian termékként kezdi meg a logikai feldolgozási fázist, amelyet a rendszer szűr, hogy eltávolítson minden olyan sort, amely nem felel meg a predikátumnak.

INNER JOIN feldolgozása

Vizsgáljuk meg a lépéseket, amelyekkel az SQL Server logikailag feldolgoz egy JOIN lekérdezést. Az egyértelműség kedvéért a következő hipotetikus példában szereplő sorok számai jelennek meg:

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

Mint tudnia kell, a FROM záradék a SELECT záradék előtt lesz feldolgozva. Vizsgáljuk meg a feldolgozást a 2. sortól kezdve:

  • A FROM záradék az HR.Employee táblát határozza meg az egyik bemeneti táblaként, az alias pedig emp.
  • A 3. sorban a JOIN operátor az INNER JOIN (a T-SQL alapértelmezett típusa) használatát tükrözi, és a Sales.SalesOrder értéket adja meg a másik bemeneti táblaként, amelynek az ord aliasa van.
  • Az SQL Server logikai Cartesian-illesztéseket hajt végre ezeken a táblákon, és virtuális táblaként továbbítja az eredményeket a következő lépéshez. (Előfordulhat, hogy a lekérdezés fizikai feldolgozása nem hajtja végre a Cartesian termékműveletet az optimalizáló döntéseitől függően. De hasznos lehet elképzelni, hogy a Cartesian termék jön létre.)
  • Az ON záradék használatával az SQL Server szűri a virtuális táblát, és csak azokat a sorokat tartja meg, amelyekben az EmployeeID érték az emp táblából megegyezik az EmployeeID értékkel az ord táblában.
  • A fennmaradó sorok a virtuális táblában maradnak, és a SELECT utasítás következő lépésére kerülnek. Ebben a példában a virtuális táblát a SELECT záradék dolgozza fel, és a rendszer visszaadja a két megadott oszlopot az ügyfélalkalmazásnak.

A befejezett lekérdezés eredménye az alkalmazottak listája és rendelési összegei. Azok az alkalmazottak, akiknek nincsenek kapcsolt megrendeléseik, az ON záradék által ki lettek szűrve, akárcsak azok a rendelések, amelyek Alkalmazottazonosítója nem felel meg a HR.Employee táblában szereplő bejegyzésnek.

Venn-diagram az Alkalmazott és a SalesOrder készlet egyező tagjairól

INNER JOIN szintaxis

Az INNER JOIN a JOIN alapértelmezett típusa, az opcionális INNER kulcsszó pedig implicit a JOIN záradékban. Az illesztési típusok keverése és egyeztetése során hasznos lehet explicit módon megadni az illesztés típusát, ahogyan az ebben a hipotetikus példában látható:

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

Lekérdezések belső illesztések használatával történő írásakor vegye figyelembe az alábbi irányelveket:

  • A tábla aliasai nem csak a SELECT listához, hanem az ON záradék írásához is előnyben részesülnek.
  • A belső illesztések elvégezhetők egyetlen egyező oszlopon, például egy OrderID-en vagy több egyező attribútumon, például az OrderID és a ProductID kombinációján. A több egyező oszlopot meghatározó illesztéseket összetett illesztéseknek nevezzük.
  • Az SQL Server-optimalizáló számára nem számít, hogy milyen sorrendben vannak felsorolva a táblák az INNER JOIN FROM záradékában. Elméletileg az illesztések kiértékelése balról jobbra történik.
  • Használja egyszer a JOIN kulcsszót a FROM listában szereplő egyes illesztett táblákhoz. Kéttáblás lekérdezéshez adjon meg egy illesztőt. Háromtáblás lekérdezés esetén kétszer kell használnia a JOIN parancsot; egyszer az első két tábla között, majd ismét a JOIN kimenete között az első két tábla és a harmadik tábla között.

INNER JOIN-példák

Az alábbi hipotetikus példa egyetlen egyező oszlopon hajt végre illesztéseket, amelyek a Production.Product tábla ProductModelID azonosítóját a Production.ProductModel tábla ProductModelID azonosítójára vonatkoznak:

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;

Ez a következő példa bemutatja, hogyan bővíthető egy belső illesztés két táblánál többre. A Sales.SalesOrderDetail tábla csatlakozik a JOIN kimenetéhez a Production.Product és a Production.ProductModel között. A JOIN/ON minden példánya saját sokaságot és a virtuális kimeneti tábla szűrését végzi. Az SQL Server lekérdezésoptimalizálója határozza meg az illesztések és szűrések végrehajtásának sorrendjét.

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;