OUTER JOIN och WHERE i T-SQL

Det finns en viktig sak att tänka på när du använder en outer join i en fråga i T-SQL. Nämligen om du ska använda någon filtrering på tabellen som ligger i en outer join. Det är här viktigt var du lägger filtreringen. Om du lägger den i WHERE-delen kommer frågan att exekveras som en inner join. Vi tar ett enkelt exempel.

Börja med att lägga till en tabell och infoga två rader:

CREATE TABLE dbo.MyInvoice (MyInvoiceID int,RegDate date)
GO

INSERT dbo.MyInvoice (MyInvoiceID,RegDate)
VALUES (1,'2011-01-13'),(2,'2011-01-14')
GO

Lägg sedan till ytterligare en tabell med ett par rader som relaterar till den första fakturan (MyInvoiceID = 1) ovan:

CREATE TABLE dbo.MyInvoiceRecord (MyInvoiceRecordID INT,MyInvoice INT,Amount INT)
GO

INSERT dbo.MyInvoiceRecord(MyInvoiceRecordID,MyInvoice,Amount)
VALUES (1,1,500),(2,1,300)
GO

Vi vill nu ta ut en fråga som visar alla fakturor, men inte ta med de fakturarader som har ett värde under 400. Det är då lätt att man skriver på följande sätt:

SELECT *
FROM MyInvoice

LEFT JOIN MyInvoiceRecord ON yInvoice.MyInvoiceID = MyInvoiceRecord.MyInvoice
WHERE MyInvoiceRecord.Amount>400

Men om vi nu använder tabellen MyInvoiceRecord (som ligger i en outer join) i where-delen kommer frågan exekveras som en inner join, dvs fakura med id 1 kommer inte med, då den saknar fakturarader. Lösningen är att lägga villkoret vid ON istället:

SELECT *
FROM MyInvoice
LEFT JOIN MyInvoiceRecord ON MyInvoice.MyInvoiceID = MyInvoiceRecord.MyInvoice AND MyInvoiceRecord.Amount>400

Ta bort tabellerna:

DROP TABLE dbo.MyInvoice
GO
DROP TABLE dbo.MyInvoiceRecord
GO  

 


Text: Per Sjöblom


Totalt

0SEK
Till Kassan
exkl. moms
Addskills
Stockholm
Olof Palmes gata 31
Telefon: +46 8 440 11 00
E-post: info@addskills.se
Göteborg
Lindholmspiren 5
Telefon: +46 31 46 72 00
E-post: info@addskills.se
Malmö
Västergatan 38
Telefon: +46 40 92 38 00
E-post: info@addskills.se
Uppsala
Bangårdsgatan 13
Telefon: +46 18 50 00 30
E-post: info@addskills.se
Linköping
Teknikringen 1E
Telefon: +46 13 37 67 50
E-post: info@addskills.se

Addskills AB, Säte: Stockholm, Org.nr: 556404-6133

webmaster@addskills.se
Clear