Använd 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 INNER JOIN:
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 Belopp-värdet returnerar frågan NULL för de anställda som saknar 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, så att alla dess rader visas, oavsett om de har 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 SAMMANFOGNING spelar ordningen på hur tabeller listas och kopplas samman i FROM-satsen roll för YTTRE SAMMANFOGNING, eftersom det avgör om du väljer VÄNSTER eller HÖGER för din sammanfogning.
- Flertabellskopplingar blir mer komplexa när en OUTER JOIN finns. 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 går inte att förutsäga i vilken ordning raderna kommer tillbaka utan en ORDER BY-klausul. Det går inte att veta om de matchade eller omatchade raderna returneras först.