Johdatus Ulompi Liittyy
Ulompi Liittyy
Ulompi liittyy käytetään ottelu rivit kaksi taulukkoa. Vaikka ei ole match rivit ovat mukana. Rivejä yhdestä taulukosta on aina mukana, toiselle, kun ei ole osumia, nolla-arvot ovat mukana.
sarja alkaa artikkelista Introduction to Database Joins. Kaikki tämän oppitunnin esimerkit perustuvat Microsoft SQL Server Management studioon ja AdventureWorks2012-tietokantaan. Voit aloittaa käyttämällä näitä ilmaisia työkaluja minun opas alkaa SQL Server., Tässä artikkelissa aiomme kattaa ulompi liittyy.
Tyyppisiä Ulompi Liittyy
On olemassa kolmenlaisia ulompi liittyy:
- Left Outer Join – Kaikki rivit vasemmalta taulukossa ovat mukana, vertaansa vailla krs oikealta korvataan NULL-arvoja.
- Right Outer Join – kaikki rivit oikeasta taulukosta ovat mukana, verrattomat rivit vasemmalta korvataan nollilla arvoilla.
- Full Outer Join – kaikki rivit molemmista taulukoista ovat mukana, nolla-arvot täyttävät verrattomat rivit.
kaivetaan syvemmältä ja tutkitaan vasemmanpuoleista ulompaa liittymää.,
left Outer Join
katso seuraava tietomalli. Tämä on otettu AdventureWorks2012-tietokannasta. Tässä mallissa on 1 Henkilö 0 tai 1 Työntekijää.
rakentaa luettelo kaikista Henkilö LastNames, mutta osoittavat myös, JobTitle, jos Henkilö on Työntekijä, tarvitsemme tapa liittyä kaksi taulukkoa, ja sisältävät Henkilön riviä tulos, vaikka ne eivät vastaa Työntekijä.
Tämän tyyppinen liittyä kutsutaan left outer join, koska kaikki rivit taulukon vasemmalta puolelta JOIN avainsana on mukana riippumatta ottelun., Perus syntaksi left outer join on:
SELECT columnlistFROM tableLEFT OUTER JOIN othertable ON join condition
SQL liittyä yllä olevassa kuvassa on:
SELECT person.Person.BusinessEntityID, Person.Person.LastName, HumanResources.Employee.NationalIDNumber, HumanResources.Employee.JobTitleFROM person.PersonLEFT OUTER JOIN HumanResources.Employee ON person.BusinessEntityID = Employee.BusinessEntityID
Tässä ovat ensimmäiset tulokset kysely
Huomaa, miten on NULL-arvot on lueteltu toisen rivin NationalIDNumber ja JobTitle. Tämä johtuu siitä, että ei ole työntekijöitä, jotka vastaavat BusinessEntityID 293.
Oikea Ulompi Liittyä
Let ’ s ottaa toisen tarkastella kaavio, mutta tällä kertaa teemme oikea ulompi liittyä., Kuten saatoitte arvata, ei ole liikaa eroa SQL välillä left outer join-ja right outer join. Perus syntaksi on oikea ulkoliitos on:
SELECT columnlistFROM tableRIGHT OUTER JOIN othertable ON join condition
Alla on meidän näyte kysely kirjoitettu kuin oikea ulompi liittyä:
SELECT person.Person.BusinessEntityID, Person.Person.LastName, HumanResources.Employee.NationalIDNumber, HumanResources.Employee.JobTitleFROM person.PersonRIGHT OUTER JOIN HumanResources.Employee ON person.BusinessEntityID = Employee.BusinessEntityID
keskeinen ero on, että nyt olemme menossa palauttaa kaikki tietueet Työntekijän taulukosta, joka on pöydän oikealla liittyä avainsana. Jos vastaavaa työntekijärekisteriä ei löydy, NULL palautetaan Businessentityidille ja sukunimelle.
tässä kyselyn tulokset.,
olen vierittää läpi kaikki tulokset ja oli yllättynyt ei nähdä mitään null-arvoja.
tiedätkö miksi?
vastaus löytyy tietomallista. On 0..1-1 työntekijän ja henkilön välinen suhde. Tämä tarkoittaa sitä, että jokaiselle työntekijälle on yksi henkilö. Koska tämä, oikea liittyä ei ole mitään ei-vastaavia rivejä. Tämän tyyppisellä suhteella olisi voinut käyttää myös sisäistä liittymää.
Vasen vs. Oikea Ulompi Liittyy
ei ole mitään eroa toiminnallisuuden välillä left outer join-ja right outer join.,
lausunto
SELECT person.Person.BusinessEntityID, HumanResources.Employee.NationalIDNumberFROM person.PersonLEFT OUTER JOIN HumanResources.Employee ON person.BusinessEntityID = Employee.BusinessEntityID
Palauttaa saman tuloksen kuin
SELECT person.Person.BusinessEntityID, HumanResources.Employee.NationalIDNumberFROM HumanResources.EmployeeRIGHT OUTER JOIN person.Person ON person.BusinessEntityID = Employee.BusinessEntityID
tietenkin tämä ei olisi, jos minulla oli vain muuttuneet liittyä VASEMMALTA OIKEALLE ja ole kytketty taulukon nimet.
käytän tyypillisesti vasenta ulompaa liitosta enemmän kuin oikeaa ulompaa liitosta. Luulen, että tämä johtuu siitä, että kun piirrän suhteita teen niin vasemmalle oikealle. Lisäksi kierrän pöydät päässäni vasemmalta oikealle.
Tämä sopii hyvin SQL kuten ”vasen” taulukko on PERÄISIN lausunto.
olen utelias tietämään, mitä käytät., Olen todella utelias tietämään, onko oikea liittyy tuntuu intuitiivisempi sinulle, Jos olet äidinkielenään puhuja arabian tai jokin muu ”oikealta vasemmalle” kieli.
Full Outer Join
täysi ulkoliitos on yhdistelmä tuloksia vasen ja oikea ulkoliitos. Tämän tyyppisestä liittymästä palautetut tulokset sisältävät kaikki rivit molemmista taulukoista. Jos ottelut tapahtuvat, arvot liittyvät toisiinsa. Jos sovitettu jommastakummasta pöydästä älä, niin NULL palautetaan sen sijaan.,
perus syntaksi täysi ulkoliitos on:
SELECT columnlistFROM tableFULL OUTER JOIN othertable ON join condition
katsotaanpa katsomaan eri osa AdventureWork2012 tietokantaan. Tällä kertaa keskitymme salesorderheaderin ja Currentcyrate-taulukoiden välisiin suhteisiin.
malli on esitetty alla:
Oletetaan, että haluamme tietää kaikki valuutat voimme tilauksia ja tilauksia, jotka oli sijoitettu niin, että ne valuutat?
SELECT sales.SalesOrderHeader.AccountNumber, sales.SalesOrderHeader.OrderDate, sales.CurrencyRate.ToCurrencyCode, sales.CurrencyRate.AverageRateFROM sales.SalesOrderHeaderFULL OUTER JOIN sales.CurrencyRate ON sales.CurrencyRate.CurrencyRateID = sales.SalesOrderHeader.CurrencyRateID
Tässä osa tuloksista osoittaa, missä jotkut myynti on ottelu valuutta ja joitakin, jotka eivät ole., Syynä on myynti, joka ei vastaa on, että nämä ovat myynti USD.
alempana tulokset näet valuutat, joilla ei ole vastaavia liikevaihto. Tämä kuvastaa sitä, että kyseisissä valuutoissa ei tehty myyntiä.
Huom: olin yllättynyt siitä, USD luettelossa, katso rivi 42463, koska luulisin enemmistön myynti olisi tässä valuutassa. Ajatukseni on, että sen sijaan, että näiden liiketoimien valuuttakurssia kunnioitettaisiin, Currencyrateidin myyntijohtaja vale määrättiin mitättömäksi kaikkien USD-liiketoimien osalta., Mielestäni tämä ei ole johdonmukaista, ja ei ole tapa haluan tehdä sen, mutta se ei ole minun tietokanta…
Lisäasetukset-Esimerkki
tähän mennessä olemme tutkineet kolmen tyyppisiä ulompi liittyy, mutta ei ole tutkittu joitakin kehittyneempiä käsitteitä, kuten liittymällä useita taulukko ja käyttämällä enemmän kuin yksi ehto meidän liittyä lausekkeita.
Olemme käsitelleet näitä käsitteitä kun tutkimme sisä liittyy, niin mitä minä voin näyttää sinulle, ei pitäisi olla liian uutta, mutta mielestäni se on edelleen järkevää tarkastella, koska joissakin tapauksissa sekoittamalla täyden liittyy sisäinen liittyy voi tuottaa odottamattomia tai tahattomia tuloksia.,
siirrytään keskittymään tuotantotekniikkaan ja tutkitaan tuotteita ja luokkia. Laaditaan luettelo kaikista tuoteluokista ja niihin sisältyvistä tuotemalleista.
tuotteella on yksi tai monta suhdetta Tuotteeseenmodeliin ja Tuotteisiinstrategiaan. Koska se on näiden kahden taulukon välillä, on implisiittisesti monia suhde Tuotteenmallin ja Tuotteidenstrategian välillä. Tämän vuoksi se on hyvä ehdokas ulompi liittyy, koska voi olla tuotemalleja, joissa ei ole osoitettuja tuotteita ja Tuotteitatuotemerkinnät ilman tuotetta.,
ratkaista tämä tilanne teemme ulompi liittyä sekä ProductModel-ja ProductCategory-taulukossa.
Tässä on SQL
SELECT PC.Name AS Category, PSC.Name AS Subcategory, PM.Name AS Model, P.Name AS ProductFROM Production.Product AS PFULL OUTER JOIN Production.ProductModel AS PM ON PM.ProductModelID = P.ProductModelIDFULL OUTER JOIN Production.ProductSubcategory AS PSC ON PSC.ProductSubcategoryID = P.ProductSubcategoryIDINNER JOIN Production.ProductCategory AS PC ON PC.ProductCategoryID = PSC.ProductCategoryIDORDER BY PC.Name, PSC.Name
On olemassa useita kohteita huomautus:
- käytin taulukko aliakset tehdä SQL enemmän luettavissa.
- on useampi kuin yksi täysi ulompi liittymälauseke.,
- ProductCategory taulukossa on myös osa ulompi liittyä
Alunperin kun kirjoitin SQL-tämän kyselyn olin sisäliitos välillä ProductSubcategory-ja ProductCategory, mutta en nähnyt NULL-arvot verraton kirjaa odotan.
kun vaihdoin liittymän täyteen ulompaan liittymään näin tulokset, joita odotin. Syy tähän on hienovarainen.
tarkistettuani tiedot vahvistin, että kaikki kategoriat on luokiteltu alaluokiksi., Koska tämän luulisi sisäliitos toimisi; kuitenkin harkita, että koko lauseke suoritetaan, ja rivit ovat palasi, ProductSubcategoryID arvo on NULL, kun tuote ei vastaa tuotteen alaluokka.
nolla-arvot eivät määritelmän mukaan ole yhtä suuret keskenään, joten sisäinen liitos epäonnistuu. Koska tämä, kun nämä arvot ovat sitten sovitettu ProductCategory ne eivät sisälly tulos, ellei liittyä ProductCategory on ulompi liittyä.,
Itse asiassa, liittyä ei tarvitse olla full outer join, vasen liittyä toimii aivan yhtä hyvin:
SELECT PC.Name AS Category,PSC.Name AS Subcategory,PM.Name AS Model,P.Name AS ProductFROM Production.Product AS PFULL OUTER JOINProduction.ProductModel AS PMON PM.ProductModelID = P.ProductModelIDFULL OUTER JOINProduction.ProductSubcategory AS PSCON PSC.ProductSubcategoryID = P.ProductSubcategoryIDLEFT OUTER JOIN Production.ProductCategory AS PC ON PC.ProductCategoryID = PSC.ProductCategoryIDORDER BY PC.Name, PSC.Name
Käyttötarkoituksia Ulompi Liittyy
Koska ulompi liittyy paitsi vastaavia rivejä, mutta myös ne, jotka eivät, ne ovat todella hyvä tapa löytää puuttuvat merkinnät taulukoissa. Tämä on suuri, kun sinun täytyy tehdä diagnoosi tietokannan selvittää, onko tietojen eheys kysymyksiä.
esimerkiksi oletetaan, että olemme huolissamme siitä, että meillä saattaa olla joitakin tuotteita, jotka eivät vastaa luokkia., Voimme testata suorittamalla seuraava SQL –
SELECT PSC.Name AS SubcategoryFROM Production.ProductCategory AS PSCLEFT OUTER JOIN Production.ProductSubcategory AS PC ON PC.ProductCategoryID = PSC.ProductCategoryIDWHERE PSC.ProductCategoryID is NULL
ulkoliitos palauttaa verraton rivin arvot kuin NULL-arvoja. Where-lauseke suodattaa ei-nolla-arvot, jättäen vain ei-yhdenmukaiset alaluokan nimet meille tarkistaa.
ulomman liitoksen voi myös kysyä esimerkiksi:
”Mitä myyntihenkilöt eivät ole koskaan tehneet kauppaa?”
” Mitä tuotteita ei ole määrätty tuotemalliin?”
” millä osastoilla ei ole palkattuja työntekijöitä?”
” listaa kaikki myyntialueet, joille ei ole annettu myyntihenkilöitä.”