Använda inre kopplingar
Den vanligaste typen av JOIN i T-SQL-frågor är INRE KOPPLING. Inre kopplingar används för att lösa många vanliga affärsproblem, särskilt i mycket normaliserade databasmiljöer. Om du vill hämta data som har lagrats i flera tabeller måste du ofta kombinera dem via INRE JOIN-frågor. En INRE KOPPLING börjar sin logiska bearbetningsfas som en kartesisk produkt, som sedan filtreras för att ta bort alla rader som inte matchar predikatet.
Bearbeta en INRE KOPPLING
Nu ska vi gå igenom stegen där SQL Server logiskt bearbetar en JOIN-fråga. Radnummer i följande hypotetiska exempel läggs till för tydlighetens skull:
1) SELECT emp.FirstName, ord.Amount
2) FROM HR.Employee AS emp
3) JOIN Sales.SalesOrder AS ord
4) ON emp.EmployeeID = ord.EmployeeID;
Som du bör känna till bearbetas FROM-satsen före SELECT-satsen. Låt oss spåra bearbetningen, från och med rad 2:
- FROM-satsen anger HR. Medarbetartabell som en av indatatabellerna, vilket ger den alias emp.
- JOIN-operatorn på rad 3 återspeglar användningen av en INRE KOPPLING (standardtypen i T-SQL) och anger Sales.SalesOrder som den andra indatatabellen, som har ett alias för ord.
- SQL Server utför en logisk kartesisk koppling i dessa tabeller och skickar resultatet som en virtuell tabell till nästa steg. (Den fysiska bearbetningen av frågan kanske inte utför den kartesiska produktåtgärden, beroende på optimerarens beslut. Men det kan vara bra att föreställa sig den kartesiska produkten som skapas.)
- Med hjälp av ON-satsen filtrerar SQL Server den virtuella tabellen och behåller endast de rader där ett EmployeeID-värdefrån emp-tabellen matchar ett EmployeeID i ordtabellen .
- De återstående raderna finns kvar i den virtuella tabellen och överlämnas till nästa steg i SELECT-instruktionen. I det här exemplet bearbetas den virtuella tabellen sedan av SELECT-satsen och de två angivna kolumnerna returneras till klientprogrammet.
Resultatet av den slutförda frågan är en lista över anställda och deras orderbelopp. Anställda som inte har några associerade beställningar har filtrerats bort av ON-villkoret, och alla beställningar som råkar ha ett EmployeeID som inte motsvarar en post i HR.Employee-tabellen har också filtrerats bort.
SYNTAX FÖR INRE KOPPLING
En INRE KOPPLING är standardtypen JOIN och det valfria inre nyckelordet är implicit i JOIN-satsen. När du blandar och matchar kopplingstyper kan det vara användbart att uttryckligen ange kopplingstypen, vilket visas i det här hypotetiska exemplet:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
När du skriver frågor med hjälp av inre kopplingar bör du tänka på följande riktlinjer:
- Tabellalias är att föredra, inte bara för SELECT-listan, utan även för att skriva ON-satsen.
- Inre kopplingar kan utföras på en enda matchande kolumn, till exempel ett OrderID eller på flera matchande attribut, till exempel kombinationen av OrderID och ProductID. Kopplingar som anger flera matchande kolumner kallas sammansatta kopplingar.
- Den ordning i vilken tabeller visas i FROM-satsen för en INRE KOPPLING spelar ingen roll för SQL Server-optimeraren. Konceptuellt utvärderas kopplingar från vänster till höger.
- Använd nyckelordet JOIN en gång för varje par med anslutna tabeller i FROM-listan. För en fråga med två tabeller anger du en koppling. För en fråga med tre tabeller använder du JOIN två gånger. en gång mellan de två första tabellerna och återigen mellan utdata från JOIN mellan de två första tabellerna och den tredje tabellen.
EXEMPEL PÅ INRE KOPPLING
Följande hypotetiska exempel utför en koppling på en enda matchande kolumn som relaterar ProductModelID i tabellen Production.Product till ProductModelID i tabellen Production.ProductModel :
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
ON p.ProductModelID = m.ProductModelID
ORDER BY p.ProductID;
I nästa exempel visas hur en inre koppling kan utökas till att omfatta fler än två tabeller. Tabellen Sales.SalesOrderDetail är kopplad till utdata från JOIN mellan Production.Product och Production.ProductModel. Varje instans av JOIN/ON gör sin egen population och filtrering av den virtuella utdatatabellen. SQL Server-frågeoptimeraren avgör i vilken ordning kopplingarna och filtreringen ska utföras.
SELECT od.SalesOrderID, m.Name AS Model, p.Name AS ProductName, od.OrderQty
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
ON p.ProductModelID = m.ProductModelID
INNER JOIN Sales.SalesOrderDetail AS od
ON p.ProductID = od.ProductID
ORDER BY od.SalesOrderID;