Kuinka löydän päällekkäiset arvot SQL Serveristä?
Tässä artikkelissa on tietoja siitä, miten päällekkäiset arvot löydetään taulukosta tai näkymästä SQL: n avulla. Käymme läpi vaihe vaiheelta. Aloitamme yksinkertaisella ongelmalla, rakennamme SQL: n hitaasti, kunnes saavutamme lopputuloksen.
Loppuun mennessä ymmärrät mallin, jota käytetään tunnistamaan päällekkäiset arvot ja pystyt käyttämään sisään tietokantasi.
Kaikki tämän oppitunnin esimerkit perustuvat Microsoft SQL Server Management Studioon ja AdventureWorks2012-tietokantaan. Voit aloittaa näiden ilmaisten työkalujen käytön Oppaalla Aloitusopas SQL Serverin avulla.
Etsi päällekkäiset arvot SQL Serveristä
Aloitetaan. Perustamme tämän artikkelin reaalimaailman pyyntöön. henkilöstöpäällikkö haluaa sinun löytävän kaikki työntekijät jakamaan samaa syntymäpäivää. Hän haluaa, että luettelo on lajiteltu syntymäpäivän ja työntekijän nimen mukaan.
Tietokannan tarkastelun jälkeen käy ilmi, että HumanResources.Employee-taulukko on käytettävä, koska se sisältää työntekijöiden syntymäpäivät.
ensi silmäyksellä näyttää siltä, että on melko helppoa löytää päällekkäisiä arvoja SQL-palvelimelta. Loppujen lopuksi voimme lajitella tiedot helposti.
Mutta kun tiedot on lajiteltu, ne vaikeutuvat! Koska SQL on asetettu kieli, ei ole helppoa tapaa tuntea edellisen tietueen arvoja lukuun ottamatta kursoreiden käyttöä.
Jos tietäisimme nämä, voimme vain verrata arvoja, ja kun ne olivat merkitse tietueet kopioiksi.
Onneksi meillä on toinen tapa tehdä se. Käytämme INNER JOIN -palvelua työntekijöiden syntymäpäivien sovittamiseen. Tällöin saamme luettelon työntekijöistä, joilla on sama syntymäpäivä.
Tämä tulee olemaan rakenteiden mukaan artikkeli. Aloitan yksinkertaisella kyselyllä, näytän tuloksia ja huomautan, mitä tarvitsee tarkentaa, ja siirry eteenpäin. Aloitetaan hakemalla luettelo työntekijöistä ja heidän syntymäpäivästään.
Vaihe 1 – Hanki luettelo työntekijöistä, jotka on lajiteltu syntymäpäivän mukaan
Kun työskentelet SQL: n kanssa, erityisesti tuntemattomalla alueella, Minusta on parempi rakentaa lauseke pienin askelin, varmentaa tulokset kulkiessasi, sen sijaan, että kirjoittaisit ”lopullisen” SQL: n yhdessä vaiheessa, jotta löydän vain minun vianmäärityksen.
Vihje: Jos työskentelet erittäin suuren tietokannan kanssa, voi olla järkevää tehdä pienempi kopio kehittäjänä tai testiversiona ja käyttää sitä kyselyidesi kirjoittamiseen. Näin et tuhota tuotantotietokannan suorituskykyä ja vie kaikki alas sinä.
Ensimmäisessä vaiheessa aiomme siis luetella kaikki työntekijät. Tätä varten liitämme Työntekijä-taulukon Henkilö-taulukkoon, jotta voimme saada työntekijän nimen.
Tässä on tähän mennessä tehty kysely
SELECT E1.BusinessEntityID, P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityIDORDER BY E1.BirthDate, FullName
Jos tarkastelet tulosta, näet kaikki henkilöstöpäällikön pyynnön elementit, paitsi että näytämme jokaisen työntekijän
Seuraavassa vaiheessa määritämme tulokset, jotta voimme alkaa vertailla syntymäaikoja päällekkäisten arvojen löytämiseksi.
VAIHE 2 – Vertaa syntymäpäiviä kaksoiskappaleiden tunnistamiseen.
Nyt se meillä on luettelo työntekijöistä, tarvitsemme nyt keinoja vertailla syntymäaikoja, jotta voimme tunnistaa työntekijät, joilla on samat syntymäajat. Yleensä nämä ovat päällekkäisiä arvoja.
Vertailun tekemiseksi teemme itseliitoksen työntekijän taulukossa. Itseliittyminen on vain yksinkertaistettu versio INNER JOIN. Aloitamme syntymäpäivän käyttämisen liittymisehtona. Tämä varmistaa, että haemme vain työntekijöitä, joilla on sama syntymäpäivä.
SELECT E1.BusinessEntityID, E2.BusinessEntityID, P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityID INNER JOIN HumanResources.Employee AS E2 ON E2.BirthDate = E1.BirthDateORDER BY E1.BirthDate, FullName
Lisäsin kyselyyn E2.BusinessEntityID-tunnuksen, jotta voit verrata molempien ensisijaista avainta E1 ja E2. Näet monissa tapauksissa, että ne ovat samat.
Keskitymme BusinessEntityID: ään siksi, että se on taulukon ensisijainen avain ja yksilöllinen tunniste. Siitä tulee erittäin ytimekäs ja kätevä tapa tunnistaa rivin tulokset ja ymmärtää sen lähde.
Olemme lähestymässä lopputuloksen saamista, mutta kun olet tarkistanut tulokset, näet ’ poimimme saman tietueen sekä E1- että E2-otteluissa.
Tarkista punaisella ympyröidyt kohteet. Nämä ovat vääriä positiiveja, jotka meidän on poistettava tuloksistamme. Nämä ovat samat rivit, jotka vastaavat toisiaan.
Hyvä uutinen on, että olemme todella lähellä tunnistamaan kaksoiskappaleet.
Kierrin 100% taatun kaksoiskappaleen sinisenä. Huomaa, että BusinessEntityID: t ovat erilaisia. Tämä tarkoittaa, että itseliittyminen vastaa syntymäaikaa eri riveillä – totta kaksoiskappaleet varmasti.
Seuraavassa vaiheessa otamme nämä vääriä positiiveja eteenpäin ja poistamme ne tuloksistamme.
Vaihe 3 – Poista osumat samalle riville – Poista väärät positiiviset
Edellisessä vaiheessa olet ehkä huomannut, että kaikilla väärillä positiivisilla vastaavuuksilla on sama BusinessEntityID; todelliset kaksoiskappaleet eivät kuitenkaan olleet tasa-arvoisia.
Tämä on iso vihjeemme.
Jos haluamme nähdä vain kaksoiskappaleet, meidän on tuotava ottelut takaisin vain liittymästä, jossa BusinessEntityID-arvot eivät ole samat.
Tätä varten voimme lisätä
E2.BusinessEntityID <> E1.BusinessEntityID
Liittymisen ehtoina omaan liittymiseemme. Olen värittänyt lisätyn ehdon punaisella.
SELECT E1.BusinessEntityID, E2.BusinessEntityID, P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityID INNER JOIN HumanResources.Employee AS E2 ON E2.BirthDate = E1.BirthDate AND E2.BusinessEntityID <> E1.BusinessEntityIDORDER BY E1.BirthDate, FullName
Kun tämä kysely on suoritettu, tuloksissa on vähemmän rivejä ja jäljellä olevia ovat todella kaksoiskappaleita.
Koska tämä oli yrityspyyntö, puhdistetaan kysely, jotta näytämme vain pyydetyt tiedot.
Vaihe 4 – Viimeiset kosketukset
Otetaan päästä eroon kyselyn BusinessEntityID-arvoista. He auttoivat meitä vain vianetsinnässä.
Viimeinen kysely on lueteltu tässä
SELECT P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityID INNER JOIN HumanResources.Employee AS E2 ON E2.BirthDate = E1.BirthDate AND E2.BusinessEntityID <> E1.BusinessEntityIDORDER BY E1.BirthDate, FullName
Ja tässä on tuloksia, joita voit esittää henkilöstöpäällikkö!
Yksi lukijoistani Mark huomautti minulle, että jos on kolme työntekijää, joilla on samat syntymäpäivät, sinulla olisi kopiot lopullisissa tuloksissa. Vahvistin tämän ja se on totta. Voit palauttaa luettelon, joka näyttää kaikki kaksoiskappaleet vain kerran, käyttämällä DISTINCT-lausetta. Tämä kysely toimii kaikissa tapauksissa:
SELECT DISTINCT P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityID INNER JOIN HumanResources.Employee AS E2 ON E2.BirthDate = E1.BirthDate AND E2.BusinessEntityID <> E1.BusinessEntityIDORDER BY E1.BirthDate, FullName
lopulliset kommentit
Yhteenvetona tässä ovat vaiheet, jotka teimme taulukon kaksoiskappaleiden tunnistamiseksi. .
- Olemme ensin luoneet kyselyn tiedoista, joita haluamme tarkastella. Esimerkissämme tämä oli työntekijä ja heidän syntymäpäivänsä.
- Suoritimme itseliittymisen, INNER JOIN samalle pöydälle geek puheessa ja käytimme kenttää, jonka katsottiin olevan kopioitu. Meidän tapauksessamme halusimme löytää päällekkäisiä syntymäpäiviä.
- Lopuksi poistimme saman rivin vastaavuudet sulkemalla pois rivit, joissa ensisijaiset avaimet olivat samat.
Ottamalla askel askeleelta lähestymistapa näet, että otimme paljon arvauksia kyselyn luomiseen.
Jos haluat parantaa kyselyjen kirjoittamista tai vain hämmentää sitä ja etsit tapa puhdistaa sumu, voinko sitten ehdottaa oppaani Kolme vaihetta parempaan SQL: ään.