Bevezetés a külső csatlakozások

0 Comments

külső csatlakozások

külső csatlakozások használják, hogy megfeleljen sorok két asztal. Még ha nincs mérkőzés sorok szerepelnek. Az egyik asztal sorai mindig szerepelnek, a másik pedig, ha nincsenek egyezések, NULL értékek szerepelnek.

a sorozat a cikk bevezetésével kezdődik Adatbázis csatlakozik. Az összes példa erre a leckére a Microsoft SQL Server Management Studio és a AdventureWorks2012 adatbázison alapul. Elkezdheti használni ezeket az ingyenes eszközöket az útmutatóm segítségével az SQL Server használatával., Ebben a cikkben a külső csatlakozásokat fogjuk fedezni.

A külső csatlakozások típusai

háromféle külső csatlakozás létezik:

  • bal külső csatlakozás – a bal oldali táblázat összes sorát tartalmazza, a jobb oldali páratlan sorokat NULL értékekkel helyettesítik.
  • jobb Külső Csatlakozás – a jobb oldali táblázat összes sorát tartalmazza, a bal oldali páratlan sorokat NULL értékekkel helyettesítik.
  • teljes külső csatlakozás-mindkét táblázat összes sorát tartalmazza, a NULL értékek páratlan sorokat töltenek ki.

ássunk mélyebbre és fedezzük fel a bal külső csatlakozást.,

bal külső csatlakozás

nézze meg a következő adatmodellt. Ez a AdventureWorks2012 adatbázisból származik. Ebben a modellben 1 személy 0 vagy 1 alkalmazott.

építeni egy listát az összes Személy LastNames, még azt is mutatják, JobTitle ha az a Személy, Munkavállaló, szükségünk van egy módja annak, hogy csatlakozzon a két tábla tartalmazza Személy sor az eredmény, még akkor is, ha nem egyeznek Alkalmazott.

Az ilyen típusú csatlakozást bal külső csatlakozásnak nevezik,mivel a táblázat összes sora a JOIN kulcsszó bal oldalán található, a mérkőzéstől függetlenül., A bal oldali külső csatlakozás alapvető szintaxisa:

SELECT columnlistFROM tableLEFT OUTER JOIN othertable ON join condition

a fenti ábrán szereplő csatlakozás SQL értéke:

SELECT person.Person.BusinessEntityID, Person.Person.LastName, HumanResources.Employee.NationalIDNumber, HumanResources.Employee.JobTitleFROM person.PersonLEFT OUTER JOIN HumanResources.Employee ON person.BusinessEntityID = Employee.BusinessEntityID

itt vannak a lekérdezés első eredményei

figyeljük meg, hogy vannak null értékek szerepelnek a második sorban a nationalidnumber and jobtitle. Ennek oka az, hogy nincsenek olyan alkalmazottak, akik megfelelnének az üzleti életnek.

jobb Külső Csatlakozás

vessünk egy pillantást a diagramra, de ezúttal jobb külső csatlakozást végzünk., Ahogy talán már sejtette, nincs túl nagy különbség az SQL utasítás között a bal külső csatlakozást, és a jobb külső csatlakozást. Az alapvető szintaxis egy megfelelő külső csatlakozás:

SELECT columnlistFROM tableRIGHT OUTER JOIN othertable ON join condition

az Alábbiakban a minta lekérdezés írni, mint a right outer join:

SELECT person.Person.BusinessEntityID, Person.Person.LastName, HumanResources.Employee.NationalIDNumber, HumanResources.Employee.JobTitleFROM person.PersonRIGHT OUTER JOIN HumanResources.Employee ON person.BusinessEntityID = Employee.BusinessEntityID

A legfontosabb különbség az, hogy most mi lesz, hogy visszaadja az összes rekordot a Munkavállaló táblázat, amely a táblázat jobb oldalán a join kulcsszó. Ha a megfelelő alkalmazotti rekord nem található, akkor a Null visszakerül a BusinessEntityID és a vezetéknév címére.

itt vannak a lekérdezés eredményei.,

végiggörgetem az összes eredményt, és meglepődtem, hogy nem látok semmilyen null értéket.

tudod miért?

a válasz az adatmodellben rejlik. Van egy 0..1-1 kapcsolat a munkavállaló és a személy között. Ez azt jelenti, hogy minden alkalmazott számára van egy személy. Tekintettel erre, a jobb csatlakozáshoz nem lesz semmilyen nem megfelelő sor. Az ilyen típusú kapcsolat akkor is használt egy belső csatlakozni.

bal versus jobb külső csatlakozások

nincs különbség a funkcionalitásban a bal külső csatlakozás és a jobb külső csatlakozás között.,

A nyilatkozat

SELECT person.Person.BusinessEntityID, HumanResources.Employee.NationalIDNumberFROM person.PersonLEFT OUTER JOIN HumanResources.Employee ON person.BusinessEntityID = Employee.BusinessEntityID

Visszatér az eredmény ugyanaz, mint a

SELECT person.Person.BusinessEntityID, HumanResources.Employee.NationalIDNumberFROM HumanResources.EmployeeRIGHT OUTER JOIN person.Person ON person.BusinessEntityID = Employee.BusinessEntityID

persze nem ez lenne a helyzet, ha csak megváltozott a join balról JOBBRA, majd nem váltott a tábla neve.

általában a bal külső csatlakozásokat használom, mint a jobb külső csatlakozásokat. Azt hiszem, ez azért van, mert amikor kapcsolatokat rajzolok, ezt balról jobbra teszem. Ezenkívül balról jobbra haladok a fejemben lévő asztalokon.

Ez a jól illeszkedik az SQL-hez, mivel a ” bal ” táblázat A FROM utasításban található.

kíváncsi vagyok, hogy mit használ., Nagyon kíváncsi vagyok arra, hogy a jobb oldali csatlakozások intuitívabbnak tűnnek-e számodra, ha arab anyanyelvű vagy más “jobbról balra” nyelv.

teljes Külső Csatlakozás

a teljes külső csatlakozás a bal és a jobb külső csatlakozás eredményeinek kombinációja. Az ilyen típusú csatlakozásból származó eredmények mindkét táblázat összes sorát tartalmazzák. Ahol mérkőzések fordulnak elő, értékek kapcsolódnak. Ahol kiegyenlített bármelyik táblázat nem, akkor NULL vissza helyett.,

a teljes külső csatlakozás alapvető szintaxisa:

SELECT columnlistFROM tableFULL OUTER JOIN othertable ON join condition

vessünk egy pillantást a AdventureWork2012 adatbázis egy másik részére. Ezúttal az értékesítők és a jelenlegi táblázatok közötti kapcsolatokra koncentrálunk.

a modell az alábbiakban látható:

tegyük fel, hogy meg akarjuk tudni az összes olyan valutát, amelyben megrendeléseket tudunk elhelyezni, és mely megrendeléseket helyezték el ezekben a pénznemekben?

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

itt van az eredmények egy része, amely megmutatja, hogy egyes eladások egy pénznemben vannak, mások pedig nem., Ennek oka az, hogy vannak olyan eladások, amelyek nem egyeznek meg, az, hogy ezek USD-ben történő értékesítés.

tovább lefelé az eredményekben olyan pénznemeket lát, amelyeknek nincs megfelelő értékesítése. Ez tükrözi azt a tényt, hogy ezekben a pénznemekben nem történt értékesítés.

Megjegyzés: meglepődtem, hogy az USD szerepel, lásd a 42463 Sort, mivel azt gondolom, hogy az eladások többsége ebben a pénznemben lenne. A gondolatom az, hogy ahelyett, hogy tisztelnék az árfolyam ezen ügylet, a SalesOrderHeader vale for CurrencyRateID volt beállítva, hogy null minden USD tranzakciók., Azt hiszem, ez nem fér össze, de nem így tennék, de nem az adatbázis…

Speciális Példa

eddig néztem a három típusú külső csatlakozik, de még nem feltárt néhány további fogalmak, mint a csatlakozás több táblázat, valamint a több mint egy állapot, az csatlakozzon záradékok.

ezeket a fogalmakat fedeztük fel, amikor feltártuk a belső csatlakozásokat, tehát amit megmutatom neked, nem lehet túl új, de azt hiszem, még mindig érdemes áttekinteni, mivel egyes esetekben a teljes csatlakozások keverése a belső csatlakozásokkal váratlan vagy nem kívánt eredményeket eredményezhet.,

fordítsuk a hangsúlyt a termelési sémára, fedezzük fel a termékeket és kategóriákat. Készítsünk egy listát az összes termékkategóriáról és a benne található termékmodellekről.

a terméknek egy-sok kapcsolata van a Productmodellel és a ProductSubcategory-val. Mivel ez a két tábla között van, implicit sok-sok kapcsolat van a Termékmodell és a termékkategória között. Emiatt jó jelölt a külső csatlakozásokra, mivel lehet, hogy vannak olyan termékmodellek, amelyeknek nincs hozzárendelt terméke és termékkategória bejegyzése termék nélkül.,

a helyzet leküzdéséhez külső csatlakozást fogunk végezni mind a ProductModel, mind a ProductCategory táblához.

itt van az 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

Több elemet kell megjegyezni:

  • táblaaliasokat használtam az SQL olvashatóbb olvasásához.
  • egynél több teljes külső csatlakozási záradék van.,
  • a ProductCategory tábla is része egy külső join

eredetileg, amikor írtam az SQL erre a lekérdezésre volt egy belső csatlakozni között ProductSubcategory és ProductCategory, de nem láttam NULL értékek páratlan rekordok vártam.

miután megváltoztattam a csatlakozást egy teljes külső csatlakozásra, láttam a várt eredményeket. Ennek oka finom.

az adatok ellenőrzése után megerősítettem, hogy minden kategória alkategóriákhoz van rendelve., Tekintettel erre azt gondolná, hogy egy belső csatlakozás működni fog; azonban, úgy vélik, hogy mivel a teljes nyilatkozat végrehajtásra kerül, és a sorok vissza, a ProductSubcategoryID érték NULL, ha egy termék nem felel meg a termék alkategória.

A Null értékek definíció szerint nem egyenlőek egymással, így a belső csatlakozás sikertelen. Ezt figyelembe véve, amikor ezeket az értékeket a ProductCategory-hoz illesztik, akkor nem szerepelnek az eredményben, kivéve, ha a Join to ProductCategory külső csatlakozás.,

valójában a csatlakozásnak nem kell teljes külső csatlakozásnak lennie, a bal oldali csatlakozás ugyanúgy működik:

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ülső csatlakozásokhoz használja

mert a külső csatlakozások nemcsak a megfelelő sorokat, hanem azokat is, amelyek nem, nagyon jó módja annak, hogy hiányzó bejegyzéseket találjanak a táblákban. Ez nagyszerű, ha meg kell tennie a diagnózist az adatbázisban annak megállapításához, hogy vannak-e adatintegritási problémák.

például tegyük fel, hogy aggódtunk amiatt, hogy lehet, hogy vannak olyan termékkategóriák, amelyek nem felelnek meg a kategóriáknak., A következő 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

futtatásával tesztelhetjük a páratlan sorértékeket NULL értékként. A where záradék szűri a nem null értékeket, így csak a nemmatching alkategória nevek számunkra, hogy vizsgálja felül.

a külső csatlakozások olyan kérdések feltevésére is felhasználhatók,mint például:

” milyen értékesítési személyek soha nem értékesítettek?”

” milyen termékek nincsenek hozzárendelve egy termékmodellhez?”

” mely osztályoknak nincs kijelölt alkalmazottjuk?”

” sorolja fel az összes értékesítési területet, amely nincs hozzárendelve értékesítési embereknek.”


Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük