Külső illesztések használata
Bár nem olyan gyakori, mint a belső illesztések, a külső illesztések használata többtáblás lekérdezésekben alternatív nézetet biztosíthat az üzleti adatokról. A belső illesztésekhez hasonlóan a táblák közötti logikai kapcsolatot is kifejezheti. Azonban nem csak az egyező attribútumokkal rendelkező sorokat fogja lekérni, hanem az egyik vagy mindkét táblában található összes sort is, függetlenül attól, hogy a másik táblában van-e egyezés.
Korábban megtanulta, hogyan kereshet egyező sorokat két tábla között az INNER JOIN használatával. Mint láthatta, a lekérdezésfeldolgozó egy INNER JOIN lekérdezés eredményeit úgy hozza létre, hogy kiszűri azokat a sorokat, amelyek nem felelnek meg az ON záradék predikátumában kifejezett feltételeknek. Az eredmény az, hogy csak a másik táblában egyező sorú sorok lesznek visszaadva. Az OUTER JOIN beállítással megjelenítheti az összes olyan sort, amelynek egyező sorai vannak a táblák között, valamint az összes olyan sort, amelynek nincs egyezése a másik táblában. Tekintsünk meg egy példát, majd vizsgáljuk meg a folyamatot.
Először vizsgálja meg a következő, INNER JOIN-tal írt lekérdezést:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Ezek a sorok egy egyezést jelentenek a HR.Employee és a Sales.SalesOrder között. Az eredményekben csak azok az EmployeeID értékek jelennek meg, amelyek mindkét táblában szerepelnek.
Most vizsgáljuk meg a következő, LEFT OUTER JOIN néven írt lekérdezést:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT OUTER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Ez a példa egy LEFT OUTER JOIN operátort használ, amely arra utasítja a lekérdezésfeldolgozót, hogy megőrizze a bal oldali tábla összes sorát (HR). Alkalmazott) és megjeleníti a Sales.SalesOrder egyező sorainak Összeg értékeit. A rendszer azonban minden alkalmazottat visszaad, függetlenül attól, hogy lekérte-e az értékesítési rendelést. Az Összeg érték helyett a lekérdezés NULL értéket ad vissza azoknak az alkalmazottaknak, akiknek nincs megfelelő értékesítési rendelésük.
KÜLSŐ ILLESZTÉS szintaxisa
A külső illesztések a BAL, a JOBB vagy a TELJES kulcsszóval vannak kifejezve a KÜLSŐ ILLESZTÉS előtt. A kulcsszó célja, hogy jelezze, melyik táblát (a JOIN kulcsszó melyik oldalán) kell megőrizni, és hogy az összes sor megjelenjen; egyezés, vagy nincs egyezés.
Ha a LEFT, a RIGHT vagy a FULL billentyűkombinációt használja az illesztés definiálásához, kihagyhatja az OUTER kulcsszót az itt látható módon:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Az INNER kulcsszóhoz hasonlóan azonban gyakran hasznos olyan kódot írni, amely kifejezetten a használt illesztés típusáról szól.
Ha az OUTER JOIN használatával ír lekérdezéseket, vegye figyelembe az alábbi irányelveket:
- Mint láthatta, a tábla aliasai nem csak a SELECT lista, hanem az ON záradék esetében is előnyben részesülnek.
- Az INNER JOIN-hez hasonlóan a KÜLSŐ ILLESZTÉS is elvégezhető egyetlen egyező oszlopon vagy több egyező attribútumon.
- Az INNER JOIN-nal ellentétben, az OUTER JOIN esetén számít, hogy a táblákat milyen sorrendben soroljuk fel és kapcsoljuk össze a FROM záradékban, mivel ez határozza meg, hogy BAL- vagy JOBB OLDALI illesztést választunk.
- A többtáblás illesztések összetettebbek, ha külső illesztés van jelen. A külső illesztés eredményeiben a NULL-ek jelenléte problémákat okozhat, ha a köztes eredmények ezután egy harmadik táblához csatlakoznak. A NULL-eket tartalmazó sorokat a második illesztés predikátuma szűrheti ki.
- Ha csak olyan sorokat szeretne megjeleníteni, ahol nincs egyezés, adjon hozzá egy NULL-tesztet egy WHERE záradékban egy OUTER JOIN predikátumot követve.
- A TELJES KÜLSŐ ILLESZTÉS ritkán használatos. Visszaadja a két tábla közötti összes egyező sort, valamint az első tábla összes sorát, amelyben nincs egyezés a másodikban, valamint a második összes sorát anélkül, hogy az elsőben egyezés lenne.
- Az ORDER BY záradék nélkül nem lehet előrejelezni, hogy a sorok hogyan térnek vissza. Nem lehet tudni, hogy a párosított vagy a nem párosított sorok kerülnek-e előbb visszaadásra.