Site Overlay

S .l Inner Join til to eller flere tabeller

brug en S .l INNER JOIN, når du skal matche rækker fra to tabeller. Rækker, der matcher forbliver i resultatet, dem, der ikke afvises. Kamptilstanden kaldes almindeligvis join-tilstanden. Når kampbetingelserne involverer ligestilling, der matcher nøjagtigt indholdet af en kolonne til en anden, kaldes s .l inner join en e .uijoin. Du vil opdage, at de fleste af de sammenføjninger, du vil bruge, er e .uijoins. En fælles situation er, hvor du skal deltage i den primære nøgle i et bord til den fremmede nøgle i en anden., Du har brug for dette, når du denormaliserer data.

Bemærk: serien starter med artiklen Introduktion til Database slutter. Alle eksempler på denne lektion er baseret på Microsoft s .l Server Management Studio og Adventure .orks2012 database. Kom i gang med at bruge disse gratis værktøjer med min Guide Kom i gang med at bruge s .l Server. I denne artikel skal vi dække indre sammenføjninger.

grundlæggende struktur af en S .l INNER JOIN

nedenfor er et eksempel på simpel select-sætning med en Inner JOIN-klausul.,

SELECT columnlistFROM maintableINNER JOIN secondtable ON join condition

overvej, om du vil oprette et bibliotek med personer og deres telefonnumre. For at gøre dette skal du kombinere rækker fra Person-og Persontelefonborde.

SQL til at gøre dette er:

SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID

Denne type deltage kaldes en equi-join, da vi bruger en ligestilling for deltage tilstand. Det er temmelig sikkert at sige, at langt de fleste af de sammenføjninger, du støder på, er eiui-joins., Der er særlige omstændigheder, hvor det giver mening at bruge andre sammenligninger, som ikke er lig med eller større end. Denne type sammenføjninger, kaldet ikke-eiui-sammenføjninger, udforskes senere i dette indlæg. Når dataene er tilsluttet, kan de også filtreres og sorteres ved hjælp af velkendt hvor og orden efter klausuler. Rækkefølgen af klausulerne er, hvad du kunne forvente:

SELECT columnlistFROM maintableINNER JOIN secondtable ON join conditionWHERE filter conditionORDER BY columnlist

clausehere-klausulen kan henvise til et af felterne fra de sammenføjede tabeller. For at være klar er det bedste praksis at præfiksere kolonnerne med tabelnavnet. Det samme gælder for sortering., Brug et hvilket som helst felt; det er dog almindeligt at sortere efter et eller flere felter, du vælger. Lad os tage vores telefonkatalog, men kun liste personer i rækkefølge efter efternavn, dem, hvis efternavne starter med C. Med dette krav i tankerne bliver vores S .l-sætning:

SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID WHERE Person.LastName LIKE 'C%' ORDER BY Person.LastName

Bemærk, at tilslutningsbetingelsen forbliver den samme. De eneste ændringer er tilføjelsen af hvor og orden efter klausuler. På nuværende tidspunkt bør disse være bekendt for dig.

Tabelaliaser gør S .l-sammenføjninger lettere at læse

Når du opretter mere komplicerede s .l-sætninger, kan de blive vanskelige at læse., Meget er af dette skyldes den verbose (ordrige) karakter af sproget. Du kan skære ned på noget af dette ved at bruge et andet navn til dine tabeller i udsagn. Brug tabelaliaser til at gøre det. Tænk på aliaser som kaldenavne. Heldigvis er det nemt at definere aliaser! Bare placere dem efter den første henvisning af tabellen navn. Her er et simpelt eksempel, hvor vi alias Persontabellen som P:

SELECT P.FirstName, P.LastName FROM Person.Person AS P

i dette eksempel brugte vi bogstavet P. Det kunne virkelig være et hvilket som helst antal tegn, men jeg kan godt lide at holde aliaser enkle. Hvor aliaser virkelig kommer godt med, er med sammenføjninger., Lad os tage sidste join vi gjorde, men denne gang skrive det ved aliasing Person som P og PersonPhone som PP. Her er oversigten

SELECT P.FirstName, P.LastName, PP.PhoneNumber FROM Person.Person AS P INNER JOIN Person.PersonPhone AS PP ON P.BusinessEntityID = PP.BusinessEntityID WHERE P.LastName LIKE 'C%' ORDER BY P.LastName

med Hensyn til navngivning, jeg formoder, at du kunne alias dine tabeller, A,B,C, men det kan blive svært at huske aliaser. Mit system til at holde aliaserne korte, men alligevel nemme at huske, er det at bruge bordets første bogstav. Hvis bordet har to ord, som PersonPhone, bruger jeg typisk det første bogstav i hvert ord.,

s .l INNER Join med mere end et felt

i nogle tilfælde kan du opleve, at du skal bruge en S .l INNER JOIN på to eller flere felter. Dette sker, når en tabel primære nøgle består af to eller flere kolonner. Brug og operatør til at forbinde slutte betingelser. Ved at bruge OG at du “siger” begge kolonner skal matche, for at slutte sig til at gå videre…

Overvej et eksempel, hvor vi ønsker at vide alle de dage og tidspunkter, hver instruktør underviser i en klasse., I vores eksempel er den primære nøgle til Klassetabellen to felter: Klassenavn og instruktør. For at konstruere tidsplanen skal vi deltage i klasse til sektion ved at matche både Klassenavn og instruktør.

Bemærk: Dette eksempel fungerer ikke i Adventure .orks2012-databasen

Når du opretter indre tilslutninger, er det vigtigt at være opmærksom på dine data. I vores eksempel, hvis vi fejlagtigt sluttede os til klassen med Sektionstabellen ved kun at bruge kolonnen Klassenavn, vil hver instruktions klasseliste også indeholde skemaer fra andre instruktioner, der underviser i den samme klasse., En indre join matcher så mange rækker som det kan mellem tabeller. Kombinationer af rækker er inkluderet i resultatet, så længe sammenføjning betingelse er opfyldt.

Når du planlægger dine sammenføjninger, skal du studere hver tabel primære nøgledefinitioner for at forstå, hvordan tabeller relaterer til hinanden.

sammenføjning af tre eller flere tabeller

i Adventure .orks2012-databasen skal du deltage i PhoneNumberType-tabellen for at vide, om et listet telefonnummer er et hjem -, celle-eller kontornummer. For at oprette en mappe med navne, telefonnummertyper og numre skal tre tabeller sammenføjes., Her er forholdet:

Herunder et andet bord i vores forespørgsel er så simpelt som at tilføje endnu en INNER JOIN-delsætning til at vores erklæring.

SELECT P.FirstName, P.LastName, PP.PhoneNumber, PT.NameFROM Person.Person AS P INNER JOIN Person.PersonPhone AS PP ON P.BusinessEntityID = PP.BusinessEntityID INNER JOIN Person.PhoneNumberType AS PT ON PP.PhoneNumberTypeID = PT.PhoneNumberTypeIDWHERE P.LastName LIKE 'C%'ORDER BY P.LastName

jeg tror ikke der er nogen hårde fast regel for, hvordan du formaterer slutte klausul, jeg har en tendens til at adskille dem på deres egne linjer, og når du angiver kolonner, skal du placere “slutte fra” første kolonne, som:

INNER JOINToTableOn FromTable.PKID = ToTable.FKID

For alle eksemplerne i denne artikel, Jeg skrev den sætning, og derefter bruges TidySQL til automatisk at formatere dem.,

Self-Join

en self-join er, når du tilmelder dig en tabel til sig selv. Når du bruger en self-join er det vigtigt at alias tabellen. Antag, at vi ønskede at liste alle afdelinger inden for en afdelingsgruppe. Du kan bruge en selvforbindelse til at gøre dette:

SELECT D1.Name, D2.Name FROM HumanResources.Department AS D1 INNER JOIN HumanResources.Department AS D2 ON d1.GroupName = d2.GroupName

da Afdelingstabellen er forbundet med sig selv, skal vi skelne mellem de to forekomster af afdelingen. De er aliased som D1 og D2. Bortset fra at tabellerne er de samme, ser du, at der ikke er noget bemærkelsesværdigt ved denne type Deltagelse.,

Ikke Equi-Joins

En ikke equi-join er bare en fancy måde at sige din deltage tilstand ikke har et lighedstegn i det. Du kan skrabe dit hoved spekulerer på, hvorfor du ønsker at bruge en ikke eiui-join. Jeg er enig, for at være ærlig, det kan være svært at tænke på eksempler; imidlertid, de findes, og du vil sætte pris på at vide, hvordan du bruger dem, når du har brug for det. En grund til at bruge en ikke-eiui-join er, når du skal kontrollere, at du har rene data. Overvej Adventurewororks2012 produkter bordet. Kontroller, at produktnavnet er unikt for hvert produkt, der er anført., En måde at gøre dette på er at selv deltage i produktbordet på navn.

SELECT P1.ProductID, P1.Name FROM Production.Product AS P1 INNER JOIN Production.Product AS P2 ON P1.Name = P2.Name ORDER BY P1.ProductNumber

Denne forespørgsel giver os mulighed for at sammenligne værdier for hver enkelt række, der svarer til det Produkt Navn. Hvis navnet er unikt, så er de eneste kampe, du skal have, når ProductID er ens. Så hvis vi leder efter duplikat Produktnavn, følger det, at vi ønsker at finde poster, der matcher at have forskellige Productids., Dette er vist i diagrammet nedenfor

s .l for at returnere duplikatposterne er:

SELECT P1.ProductID, P1.Name, P1.ProductNumberFROM Production.Product AS P1 INNER JOIN Production.Product AS P2 ON P1.Name = P2.Name AND P1.ProductID <> P2.ProductIDORDER BY P1.ProductNumber

Du kan undre dig over, hvad der sker først. Matcher computeren først navnene, og når det først er færdigt, ser det ud til ProductID, der ikke stemmer overens, eller vurderer det på en eller anden måde begge betingelser, da det bygger resultatet? Det smukke ved S .l er, at den måde, du skriver din kode på, i teorien ikke bør have indflydelse på, hvordan databasen faktisk henter dataene. Rækkefølgen af sammenføjninger eller betingelser bør ikke i væsentlig grad påvirke den tid, en forespørgsel kører., Dette vil alle blive udforsket, når vi taler om forespørgslen Optimer og hvordan man gennemgår forespørgselsplaner.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *