Belső illesztések használata
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.
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;