Windows - Táblák összekapcsolása a JOIN funkció segítségével

3. rész

forráskód letöltése
Alkalmazásaink által használt adatokat különféle táblákban tartjuk nyilván. Legtöbbször, ha lekérdezzük ezeket az adatokat, egyszerre több táblából kell összeválogatni a szükséges sorokat. Hogyan tudjuk ezt egy lekérdezésben megvalósítani? Milyen variációkat kínál a transact-sql SELECT utasítása feladatunk végrehajtására? Cikkünk választ ad a kérdésekre!
JOIN Alapelvek
A JOIN segítségével egyszerre több táblából tudunk adatokat lekérdezni a táblák logikai relációi szerint. A kapcsolatok tulajdonképpen hozzásegítenek, hogy adatokat kérdezzünk le egy táblából úgy, hogy a lekérdezéshez más táblák adatait használjuk. A JOIN feltétel definiálja a kapcsolatot két tábla között egy lekérdezésben, mégpedig úgy, hogy adatmezőket kapcsol egymáshoz, amivel meghatároz egy távoli kulcsot az egyik táblában, ami pedig azonosít egy kulcsot a másik táblában. A mezők értékének összehasonlításához logikai operátorokat használunk (=, <> és hasonlók). Kapcsolatokat definiálhatunk a FROM és a WHERE feltételben is, de mi most csak a FROM feltételben megvalósított változattal foglalkozunk, ugyanis a JOIN-t is itt használjuk, és a WHERE feltételben összekapcsolt táblák kezelése nem hatékony és nem is javasolt.
Szintaxis
FROM első_tábla join_típus második_tábla [ON (join_feltétel)]
A join típus határozza meg, hogy milyen fajta kapcsolatot használunk. Ez lehet INNER, OUTER, vagy CROSS JOIN. A join feltételben megadott állítás értékelődik ki minden egyes összekapcsolt sorra.
Ha több táblára hivatkozunk egy lekérdezésben, minden mezőhivatkozásnak egyértelműnek kell lennie. A könnyebb használhatóság kedvéért alias neveket használunk a táblák megkülönböztetésére. A lekérdezési lista tartalmazhat mezőket valamennyi összekapcsolt táblából, de ez nem kötelező. Előfordulhat, hogy pl. három táblát kapcsolunk össze, és az egyik táblát csak úgymond áthidalásként használjuk a két másik tábla között, hiszen csak így tudunk közöttük kapcsolatot létrehozni. Ilyenkor nincs szükségünk a lekérdezett elemek között a középső tábla mezőire, tehát nem is szerepeltetjük őket a select listában.
Amikor az SQL szerver feldolgozza a kapcsolatokat, a query engine a leghatékonyabb metódust választja a lehetséges változatok közül. Habár fizikailag a join-ok végrehajtása nagyon sokféle optimalizálást tartalmaz, a logikai folyamat a következő:
  • A FROM feltételben szereplő join kondíciók alkalmazása
  • A WHERE részben szereplő join és kereső funkciók végrehajtása
  • A HAVING feltételben szereplő keresési kondíciók alkalmazása
A join-ban használatos mezők alkalmazása során nem szükséges ugyanazzal a névvel, és ugyanolyan adattípussal végrehajtani a kapcsolódást, azonban ha az adattípus nem azonos, akkor kompatibilisnek kell lennie, vagy olyan típust kell használni, amit az SQL szerver egyértelműen konvertálni tud.
A join kategorizálása
  • Inner join. Ez a tipikusan legtöbbet használt kapcsolat. Összehasonlító operátor segítségével két tábla sorait felelteti meg egymásnak közös oszlopokat felhasználva mindkét táblából.
  • Outer join. Ez többféle is lehet, méghozzá right, left, vagy full outer join.
LEFT JOIN vagy LEFT OUTER JOIN
A left outer join eredményhalmaza tartalmazza a baloldali tábla minden sorát, nem csak azokat, amelyek esetén a kapcsolt oszlopok megegyeznek. Amikor egy sor a baloldali táblában nem illeszthető a jobboldali tábla egyik sorához sem, akkor az eredményhalmazban a jobboldali táblából származó oszlopok tartalma NULL értékű lesz.
RIGHT JOIN vagy RIGHT OUTER JOIN
A right outer join a left join ellentéte. A jobboldali tábla minden sorát visszakapjuk, és NULL értéket kapunk a baloldali táblából, valahányszor a jobb oldali tábla sora nem illeszthető a baloldali táblához.
FULL JOIN vagy FULL OUTER JOIN
A full outer join esetében minden sort visszakapunk egyaránt a baloldali és a jobboldali táblából is. Amikor egy sor nem illeszthető a másik táblához, akkor a másik táblából származó elemek NULL értékűek lesznek.
  • Cross join. A cross join esetén a baloldali tábla minden sorához az SQL megfelelteti a jobboldali tábla minden sorát. Tulajdonképpen Descartes-szorzatát kapjuk a tábláknak.
LEFT, RIGHT és FULL OUTER JOIN használata esetén fontos odafigyelnünk a táblák sorrendjére a FROM feltételben, mert a sorrend kihathat az eredményre. Ugyanez már nem számít a CROSS és INNER JOIN esetén.
Példák
Példa egyszerű INNER JOIN-ra. Az eredményhalmazban viszontlátjuk, hogy melyik terület melyik régióba tartozik.
SELECT TerritoryDescription, RegionDescription 
FROM Territories AS T 
INNER JOIN Region AS R ON T.RegionID = R.RegionID
Példa LEFT JOIN-ra. Az eredményhalmazból kiderül, hogy vannak olyan területek, amelyekhez nincs kapcsolva alkalmazott, és így NULL értéket kapunk.
SELECT T.TerritoryDescription, ET.EmployeeID 
FROM Territories AS T
LEFT OUTER JOIN EmployeeTerritories AS ET
ON T.TerritoryID = ET.TerritoryID
Példa CROSS JOIN-ra. Láthatjuk, hogy ebben az esetben nem kell, sőt nem is szabad ON feltételt megadnunk!
SELECT T.TerritoryDescription, ET.EmployeeID 
FROM Territories AS T
CROSS JOIN EmployeeTerritories AS ET
Az alábbi példa három táblát kapcsol össze. A középső tábla egyetlen mezője sem szerepel az eredményhalmazban, a táblát csak "áthidalásként" használjuk.
SELECT T.*, E.LastName FROM Territories T
INNER JOIN EmployeeTerritories AS ET
ON T.TerritoryID = ET.TerritoryID
INNER JOIN Employees AS E
ON ET.EmployeeID = E.EmployeeID

A Transact-SQL SELECT utasítás cikksorozat