Använda yttre kopplingar
Även om det inte är lika vanligt som inre kopplingar kan användningen av yttre kopplingar i en fråga med flera tabeller ge en alternativ vy över dina affärsdata. Precis som med inre kopplingar uttrycker du en logisk relation mellan tabellerna. Du hämtar dock inte bara rader med matchande attribut, utan även alla rader som finns i en eller båda tabellerna, oavsett om det finns en matchning i den andra tabellen eller inte.
Tidigare har du lärt dig hur du använder en INRE KOPPLING för att hitta matchande rader mellan två tabeller. Som du såg skapar frågeprocessorn resultatet av en INRE JOIN-fråga genom att filtrera bort rader som inte uppfyller villkoren som uttrycks i ON-satspredikatet. Resultatet är att endast rader med en matchande rad i den andra tabellen returneras. Med en YTTRE KOPPLING kan du välja att visa alla rader som har matchande rader mellan tabellerna, plus alla rader som inte har någon matchning i den andra tabellen. Nu ska vi titta på ett exempel och sedan utforska processen.
Granska först följande fråga, skriven med en INRE KOPPLING:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Dessa rader representerar en matchning mellan HR. Anställd och Sales.SalesOrder. Endast de EmployeeID-värden som finns i båda tabellerna visas i resultatet.
Nu ska vi undersöka följande fråga, skriven som LEFT OUTER JOIN:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT OUTER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
I det här exemplet används en LEFT OUTER JOIN-operator som dirigerar frågeprocessorn till att bevara alla rader från tabellen till vänster (HR. Medarbetare) och visar värden för Belopp för matchande rader i Sales.SalesOrder. Alla anställda returneras dock, oavsett om de har tagit en försäljningsorder eller inte. I stället för värdet Amount returnerar frågan NULL för anställda utan matchande försäljningsorder.
SYNTAX FÖR YTTRE KOPPLING
Yttre kopplingar uttrycks med nyckelorden VÄNSTER, HÖGER eller FULLSTÄNDIG före YTTRE KOPPLING. Syftet med nyckelordet är att ange vilken tabell (på vilken sida av nyckelordet JOIN) som ska bevaras och att alla dess rader ska visas. matchning eller ingen matchning.
När du använder VÄNSTER, HÖGER eller FULL för att definiera en koppling kan du utelämna nyckelordet OUTER enligt följande:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Men precis som nyckelordet INRE är det ofta bra att skriva kod som är explicit om vilken typ av koppling som används.
När du skriver frågor med hjälp av OUTER JOIN bör du tänka på följande riktlinjer:
- Som du har sett föredras tabellalias inte bara för SELECT-listan, utan även för ON-satsen.
- Precis som med en INRE KOPPLING kan en YTTRE KOPPLING utföras på en enda matchande kolumn eller på flera matchande attribut.
- Till skillnad från en INRE KOPPLING spelar ordningen i vilken tabeller visas och är anslutna i FROM-satsen viktiga för YTTRE KOPPLING, eftersom det avgör om du väljer VÄNSTER eller HÖGER för din koppling.
- Flertabellskopplingar är mer komplexa när det finns en YTTRE KOPPLING. Förekomsten av NULLs i resultatet av en YTTRE KOPPLING kan orsaka problem om mellanliggande resultat sedan kopplas till en tredje tabell. Rader med NULL:er kan filtreras bort av den andra kopplingens predikat.
- Om du bara vill visa rader där det inte finns någon matchning lägger du till ett test för NULL i en WHERE-sats efter en OUTER JOIN-predikat.
- En FULLSTÄNDIG YTTRE KOPPLING används sällan. Den returnerar alla matchande rader mellan de två tabellerna, plus alla rader från den första tabellen utan matchning i den andra, plus alla rader i den andra utan matchning i den första.
- Det finns inget sätt att förutsäga ordningen som raderna kommer tillbaka utan en ORDER BY-sats. Det går inte att veta om de matchade eller omatchade raderna returneras först.