Az illesztés fogalmainak és szintaxisának ismertetése

Befejeződött

A több táblából származó adatok kombinálásának legalapvetőbb és leggyakoribb módja a JOIN művelet használata. Vannak, akik a SELECT utasításban külön záradékként tekintenek a JOIN-ra, mások azonban a FROM záradék részeként tekintenek rá. Ez a modul elsősorban a FROM záradék részét képezi. Ebben a modulban megismerjük, hogy a T-SQL SELECT utasítás FROM záradéka hogyan hoz létre köztes virtuális táblákat, amelyeket a lekérdezés későbbi fázisai fognak felhasználni.

A FROM záradék és a virtuális táblák

Ha megismerte az SQL Server lekérdezések feldolgozásakor végrehajtott műveletek logikai sorrendjét, láthatta, hogy a SELECT utasítás FROM záradéka az első feldolgozandó záradék. Ez a záradék határozza meg, hogy melyik tábla vagy táblák lesznek a lekérdezés sorainak forrása. A FROM egyetlen táblára hivatkozhat, vagy több táblát is összehozhat a lekérdezés adatforrásaként. A FROM záradék úgy is felfogható, mint egy virtuális tábla létrehozása és feltöltése. Ez a virtuális tábla a FROM záradék kimenetét fogja tárolni, és a SELECT utasítás később alkalmazott záradékai, például a WHERE záradék használják. Ha további funkciókat, például illesztési operátorokat ad hozzá egy FROM záradékhoz, hasznos lehet úgy gondolni a FROM záradékelemek rendeltetésére, hogy sorokat adjon hozzá a virtuális táblához, vagy eltávolítson sorokat a virtuális táblából.

A FROM záradék által létrehozott virtuális tábla csak logikai entitás. Az SQL Serverben nem jön létre fizikai tábla, akár állandó, akár ideiglenes, a FROM záradék eredményeinek tárolásához, mivel az átkerül a WHERE záradékra vagy a lekérdezés más részeire.

A FROM záradék által létrehozott virtuális tábla az összes csatlakoztatott tábla adatait tartalmazza. Hasznos lehet, ha az eredményeket készletekként tekinti, és venn-diagramként koncepcializálja az illesztés eredményeit.

Egy Venn-diagram, amely az Alkalmazott táblát ábrázolja, a SalesOrder táblához kapcsolt halmazként

A T-SQL nyelv története során kibővült, hogy tükrözze az Amerikai Nemzeti Szabványügyi Intézet (ANSI) SQL-szabványainak változásait. Az egyik legjelentősebb hely, ahol ezek a változások láthatók, a FROM záradék illesztések szintaxisában található. Az ANSI SQL-89 szabványban az illesztések úgy lettek megadva, hogy több táblát is belefoglaltak a FROM záradékba egy vesszővel tagolt listába. A WHERE záradékban a belefoglalandó sorok meghatározására szolgáló szűrések, például a következők:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p, SalesLT.ProductModel AS m
WHERE p.ProductModelID = m.ProductModelID;

Ezt a szintaxist továbbra is támogatja az SQL Server, de az összetett illesztések szűrőinek összetettsége miatt nem ajánlott. Emellett ha véletlenül kihagy egy WHERE záradékot, az ANSI SQL-89 stílusú illesztések egyszerűen Cartesian-termékekké válhatnak, és túl sok eredménysort adnak vissza, ami teljesítményproblémákat és esetleg helytelen eredményeket okoz.

A többtáblás lekérdezések T-SQL-ben való írásának elsajátításakor fontos megérteni a Cartesian termékek fogalmát. A matematikában a Cartesian-termék két halmaz terméke. A két elemből és hat elemből álló készlet terméke 12 elemből vagy 6 x 2-ből áll. Az egyik készlet minden eleme össze van adva a másik halmaz minden elemével. Az alábbi példában két elemből és három elemből álló termékkészlettel rendelkezünk. A Cartesian termék minden nevet kombinál minden termékkel, amely hat elemet eredményez.

Cartesian termék

Az adatbázisokban a Cartesian-termék az egyik tábla minden sorát egy másik tábla minden sorával kombinálja. A 10 sorból álló és a 100 sorból álló táblázat eredménye 1000 sorból álló eredményhalmaz. A JOIN művelet mögöttes eredménye egy Cartesian-termék, de a legtöbb T-SQL-lekérdezés esetében a Cartesian-termék nem a kívánt eredmény. A T-SQL-ben egy Cartesian-termék akkor fordul elő, ha két bemeneti tábla csatlakozik egymáshoz anélkül, hogy figyelembe venné a köztük lévő kapcsolatokat. Ha nincs információ a kapcsolatokról, az SQL Server lekérdezésfeldolgozója a sorok összes lehetséges kombinációját visszaadja. Bár ennek az eredménynek lehetnek gyakorlati alkalmazásai, például tesztadatok generálása, ez általában nem hasznos, és súlyos teljesítménybeli következményekkel járhat.

Az ANSI SQL-92 szabvány megjelenésével hozzáadták a JOIN és ON záradékok kulcsszavak támogatását. A T-SQL ezt a szintaxist is támogatja. Az illesztések a FROM záradékban a megfelelő JOIN operátor használatával jelennek meg. A táblák közötti logikai kapcsolatot, amely szűrő predikátummá válik, az ON záradék határozza meg.

Az alábbi példa az előző lekérdezést az újabb szintaxissal egészíti ki:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p
JOIN SalesLT.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID;

Feljegyzés

Az ANSI SQL-92 szintaxisa megnehezíti a véletlen Cartesian-termékek létrehozását. A JOIN kulcsszó hozzáadása után szintaxishiba lép fel, ha hiányzik egy ON záradék, kivéve, ha a JOIN függvény KERESZTBEILLESZTésként van megadva.