Oppia, Miten Yhdistää Tietoja RAJAT LIITTYÄ

Joten miten saat yhdistelmiä JobTitle ja Sukupuoli, kun määrä on nolla?

Voimme käyttää ristiliittymää. Ajatuksena on ensin tehdä ristiliittymä sukupuolen ja arvonimen erillisistä arvoista. Nämä tulokset voidaan sitten ulompi liittyä takaisin työntekijän taulukko saada tilin.

joten mitä tämä kysely todella tekee?

jotta kirjoittaminen ja lukeminen olisi helpompaa, käytin CTE: n (Common Table Expressions) tätä kyselyä luodakseni. Jos et tunne CTE: n, ajattele niitä näkyminä toistaiseksi., Huomautus: voit lukea lisää CTEs artikkelistani Johdatus yhteisen taulukon lausekkeita.

luomme kaksi CTE on erillisiä JobTitle ja Sukupuolten arvot Työntekijän pöydälle. Ristiin liittymällä näihin pöytiin voimme näyttää kaikki mahdolliset ammattinimikkeiden ja sukupuolen yhdistelmät.,

Tässä on kyselyn voimme käyttää luoda eri yhdistelmiä:

WITH cteJobTitle (JobTitle)AS (SELECT DISTINCT JobTitle FROM HumanResources.Employee),cteGender (Gender)AS (SELECT DISTINCT Gender FROM HumanResources.Employee)SELECT J.JobTitle, G.GenderFROM cteJobTitle AS J CROSS JOIN cteGender AS GORDER BY J.JobTitle

Kun olet tutkia ennen kyselyn näet RAJAT LIITTYÄ on vain luoda yhdistelmiä kaksi erillistä erillisiä arvostettu luettelot, värikoodattu, sininen ja punainen, joiden tulokset ovat seuraavat:

Nyt, kaikki meidän täytyy tehdä, on ottaa tulokset ja yhdistää ne tiivistää tiedot saadaan ryhmittelemällä tiedot. Tiivistetyn tiedon keräämiseen käytetään jälleen CTE: tä. Ulompaa liittymää käytetään sitten yhdistämään tämä kaikkiin tekstityksen ja sukupuolen yhdistelmiin.,

syy miksi tämä toimii on, että käytät ulkoliitos palauttaa kaikki tulokset taulukko riippumatta siitä, onko ne vastaamaan toinen. Tämä on tärkeää, sillä haluamme sisällyttää kaikki tulokset rajat liittyä, joka on kaikki yhdistelmät sukupuoli ja nimi, riippumatta siitä, onko on oikeastaan tiivistää tiedot.

tiivistäen, tässä ovat askeleet, joilla luomme tämän tuloksen:

  1. hanki erillinen lista työnhakijoista. Tämä tapahtuu CTE: ssä.
  2. hanki erillinen luettelo sukupuolista. Tämä tapahtuu CTE: ssä.,
  3. luo kaikki mahdolliset yhdistelmät työnimikkeitä ja sukupuolia käyttäen CROSS JOIN.
  4. laskee palkansaajien yhteenvedon tekstityksen ja sukupuolen mukaan.
  5. vastaa laskettua yhteenvetolukua erillisellä luettelolla.

Tässä on lopullinen kysely, joka saavutetaan seuraavasti:

WITH cteJobTitle (JobTitle)AS (SELECT DISTINCT JobTitle FROM HumanResources.Employee), cteGender (Gender)AS (SELECT DISTINCT Gender FROM HumanResources.Employee), cteCounts (JobTitle, Gender, NumberEmployees)AS (SELECT JobTitle, Gender, COUNT(1) AS NumberEmployees FROM HumanResources.Employee GROUP BY JobTitle, Gender)SELECT J.JobTitle, G.Gender, COALESCE (C.NumberEmployees, 0) as NumberEmployeesFROM cteJobTitle AS J CROSS JOIN cteGender AS G LEFT OUTER JOIN cteCounts AS C ON C.JobTitle = J.JobTitle AND C.Gender = G.GenderORDER BY J.JobTitle, G.Gender;

Jotta se olisi helpompi lukea, kaksi CTE: n ja RAJAT LIITTYÄ luoda kaikki yhdistelmät JobTitle ja Sukupuoli ovat väriltään sininen ja punainen. CTE tiivistää tiedot on värillinen vihreä.

huomaa myös, että käytämme SQL COALESCE-funktiota NULL: n korvaamiseen nollaarvolla.,

Tässä on kyselyn tulos:

INNER JOIN RAJAT LIITTYÄ

Kun saat tietää SQL huomaat, siellä on yleensä enemmän kuin yksi tapa kirjoittaa kyselyn. Esimerkiksi on olemassa tapa käyttää missä lauseke on rajat liittyä käyttäytyvät kuin sisäinen liittyä.

otetaanpa nämä kaksi taulukkoa:

Oletetaan, että haluamme kyselyn kaikille työntekijöille ja näyttää niiden syntymäaika ja sukunimi. Tätä varten meidän on suhteutettava työntekijäpöytä henkilöön.,

Kuten olemme nähneet, emme voi kirjoittaa rajat liittyä yhdistää rivejä niin,

SELECT P.LastName, E.BirthDateFROM HumanResources.Employee E CROSS JOIN Person.Person P

Mutta tämä kysely ei ole kovin hyödyllistä tässä tapauksessa, koska se palaa 5,791,880 riviä!

riviyhdistelmien rajoittamiseksi niin, että henkilötiedot sovitetaan asianmukaisesti työntekijöiden riveihin, joita voidaan käyttää missä lausekkeessa. Tässä on lopullinen kysely:

SELECT P.LastName, E.BirthDateFROM HumanResources.Employee E CROSS JOIN Person.Person PWHERE P.BusinessEntityID = E.BusinessEntityID

Tässä on ensimmäinen 14 riviä 290:

Tämä kysely palauttaa samat tulokset kuin yksi kirjoitettu sisäliitos., Kyselyn avulla sisäliitos on:

SELECT P.LastName, E.BirthDateFROM HumanResources.Employee E INNER JOIN Person.Person P ON P.BusinessEntityID = E.BusinessEntityID

kyselyn, Joka on parempi? Jos katsotte kyselysuunnitelmia, huomaatte, että ne ovat hyvin samanlaisia.

Tässä on suunnitelma rajat liittyä…

Tässä on suunnitelma inner join…

Kuten voit nähdä, että ne ovat identtisiä. Syy ne ovat niin, on, että SQL on deklaratiivinen kieli, merkitys kerromme DB, mitä tulos haluat, ei välttämättä, miten tehdä se. Kun tarjoamme DBMS meidän kysely optimizer koota paras suunnitelma., Useimmissa tapauksissa se on sama vastaavien lausumien osalta.

Share

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *