privatliv & Cookies
dette .ebsted bruger cookies. Ved at fortsætte accepterer du deres brug. Få flere oplysninger, herunder hvordan du kontrollerer cookies.
Der er tidspunkter, hvor jeg gennemgår s .l-forespørgsler og finder personer, der bruger venstre ydre sammenføjninger, men derefter bruger hvor klausuler, der gør disse sammenføjninger til indre sammenføjninger. For nylig, da jeg nævnte dette til nogen, mindede de mig om, at jeg skulle blogge om it…so her blogger jeg om det. First
første off, Hvis du ikke er bekendt med de forskellige JOINs gå videre og læse denne anden s .l Tip jeg skrev., Nu, lad os komme til at lære lidt mere om venstre ydre JOIN (jeg vil henvise til det simpelthen som venstre JOIN fra her på ud).
lad os starte med nogle eksempler på data. Følgende kan bruges i begyndelsen af dine egne forespørgsler, hvis du vil køre disse tests for dig selv. Som du kan se, opretter den to tabeller (tabelvariabler).,
Hvis vi ønsker at returnere alle poster i “Tabel1” uanset om der er en forbindelse rekord i “Tabel2” og vise data fra “Tabel2”, når der er en tilhørende registrering vi ville skrive en LEFT JOIN, som så:
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID;
Output:
Men hvis vi nu ønsker at tilføje en WHERE-delsætning til at forespørgslen til kun at få data fra “Tabel2”, hvor ID er mindre end 4 vi kan gøre noget som dette:
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID < 4;
Output:
Men…vidste du se, at vi kun får de værdier, hvor der ikke er en matchende ID i begge tabeller?, Hmmm … det ser ud til at virke meget som en indre sammenføjning rigtigt? Det er fordi det er. Tror du ikke på mig? Tag et kig på udførelsen planen efter at have kørt venstre JOIN med og uden hvor betingelse. Her er hvad du vil se:
så hvordan kan vi omgå dette? Nå, da du laver en venstre JOIN til at begynde med, har du selvfølgelig brug for eller vil returnere alle poster fra “Table1” uanset dataene i “Table2”., Og hvis du virkelig ikke ønsker at returnere data til bestemte poster i “Table2”, kan du filtrere disse poster ud i dit JOIN-prædikat (‘søgekriterierne’ i den del af samlingen). For eksempel vil den sidste forespørgsel blive skrevet sådan i stedet:
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID AND tb2.columnID < 4;
Output:
se, hvordan vi stadig får de 5 poster fra “Table1”, men ikke dataene fra “Table2”, der ikke opfyldte vores kriterier? Det returnerer bare nuller for dataene i den tabel, der ikke opfylder kriterierne. Temmelig fantastisk ret?,
og … vi kan se på eksekveringsplanen igen for at bevise, at vi faktisk bruger en venstre JOIN:
hvad med når i stedet for en værdi bruger nogen is NULL-tilstanden i stedet? Nå, i så fald kan du bruge det i clausehere-klausulen.
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID IS NULL;
Output:
Og, lad os se på gennemførelsen af planen igen:
Bemærk den udfører left join og så filtrerer data for NULL records? Det er det, vi ønsker, at det skal gøre, og helt ærligt, det er det, vi sandsynligvis forventede, at det skulle gøre.
Hvad hvis vi bruger ikke er NULL i stedet? Det er en anden historie., Jeg vil forkæle overraskelsen og bare fortælle dig, at det vil gøre en indre sammenføjning, ligesom det ville gøre med en faktisk værdi. Hvis du ikke tror mig gå videre og køre forespørgslen selv og se på udførelsen planen.
så der har du det; det er sådan, at en venstre JOIN måske eller måske ikke er en venstre JOIN. Forhåbentlig hjælper disse oplysninger dig med at skrive bedre eller i det mindste mere informerede forespørgsler.