Welcome to Our Website

SQL Tip: links JOINs en waar clausules…zijn ze echt links JOINs?

X

Privacy & Cookies

deze site maakt gebruik van cookies. Door verder te gaan, gaat u akkoord met het gebruik ervan. Meer informatie, waaronder het beheren van cookies.

heb het!,

advertenties

Er zijn momenten waarop ik SQL-query ‘ s Bekijk en mensen vind die links-buitenste JOINs gebruiken, maar dan gebruik maken van waar clausules die die joins omzetten in innerlijke JOINs. Onlangs als ik dit aan iemand ze herinnerde me eraan dat ik moet bloggen over it…so hier ben ik blogging over. 🙂

ten eerste, als je niet bekend bent met de verschillende JOINs ga je gang en lees deze andere SQL Tip die ik schreef., Nu, laten we gaan leren een beetje meer over de linker buitenste JOIN (Ik zal verwijzen naar het gewoon als de linker JOIN vanaf hier op uit).

laten we beginnen met wat voorbeeldgegevens. Het volgende kan worden gebruikt aan het begin van uw eigen query ‘ s als je gaat om deze tests uit te voeren voor jezelf. Zoals je kunt zien, creëert het twee tabellen (tabelvariabelen).,

Als we terug willen keren alle records in “Tabel1” ongeacht of er sprake is van een bijbehorende record in “Tabel2” en toont de gegevens van “Tabel2” wanneer er een bijbehorend record hadden we schrijven een LEFT JOIN, zoals:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID;

Output:

Echter, als we willen nu een WHERE-component toevoegen aan de query om de gegevens van “Tabel2” waar de ID is minder dan 4 kunnen we iets doen zoals dit:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID < 4;

Output:

Maar…heb je dat krijgen we alleen de waarden waar sprake is van een matching-ID in beide tabellen?, Hmmm … dat lijkt erg veel op een INNER JOIN, toch? Dat is omdat het zo is. Geloof je me niet? Neem een kijkje op het uitvoeringsplan na het uitvoeren van de linker JOIN met en zonder de WHERE voorwaarde. Hier is wat je zult zien:

dus hoe kunnen we dit omzeilen? Goed, omdat je doet een links JOIN om te beginnen met je natuurlijk nodig hebt of wilt om alle records terug te keren van “Table1”, ongeacht de gegevens in “Table2”., En als je echt geen gegevens wilt retourneren voor bepaalde records in “Table2” dan kun je die records filteren in je JOIN predicaat (de ‘zoekcriteria’ in het ON gedeelte van de JOIN). De laatste query zou bijvoorbeeld als volgt worden geschreven:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID AND tb2.columnID < 4;

Output:

zie hoe we nog steeds de 5 records van “Table1” krijgen, maar niet de gegevens van “Table2” die niet aan onze criteria voldoen? Het geeft gewoon NULLs terug voor de gegevens in die tabel die niet aan de criteria voldoen. Geweldig, toch?,

en … we kunnen het uitvoeringsplan opnieuw bekijken om te bewijzen dat we eigenlijk een Left JOIN gebruiken:

hoe zit het met als in plaats van een waarde iemand in plaats daarvan de IS NULL-voorwaarde gebruikt? In dat geval kun je dat gebruiken in de WHERE clausule.

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID IS NULL;

Output:

en, laten we nog eens kijken naar het uitvoeringsplan:

merk op dat het de linker join uitvoert en dan de gegevens filtert voor de NULL records? Dat is wat we willen dat het doet en eerlijk gezegd, is het wat we waarschijnlijk verwacht hadden dat het zou doen.

Wat als we in plaats daarvan IS NOT NULL gebruiken? Dat is een ander verhaal., Ik zal de verrassing bederven en je gewoon vertellen dat het een innerlijke verbinding zal doen net zoals het zou doen met een werkelijke waarde. Als je me niet gelooft, ga je gang en voer de query zelf uit en kijk naar het uitvoeringsplan.

dus, daar heb je het; dat is hoe een linkse JOIN wel of niet eigenlijk een linkse JOIN kan zijn. Hopelijk helpt deze informatie u beter te schrijven, of op zijn minst, meer geà nformeerde vragen.

advertenties

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *