Johdanto Yhdistämislausekkeeseen ja SQL Server -tietomuutokseen
Yhdistämislauseketta käytetään tekemään muutoksia yhteen taulukkoon anterin perusteella sovitettujen arvojen perusteella. Sitä voidaan yhdistää lisäys-, päivitys- ja poistotoiminnot yhdeksi lauseeksi. Tässä artikkelissa tutkitaan MERGE-käskyn käyttöä. Keskustelemme parhaista käytännöistä, rajoituksista ja yhteenvedosta useilla esimerkeillä.
Tämä on viides artikkeli artikkelisarjassa. Voit aloittaa alusta lukemalla Johdanto SQL Server -tietomuutoslausekkeisiin.
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
Ennen kuin aloitamme
Vaikka tässä artikkelissa käytetään esimerkkinä AdventureWorks-tietokantaa, olen päättänyt luoda useita esimerkkitaulukoita tietokannassa käytettäväksi käsitteiden havainnollistamiseksi paremmin. Täältä löydät suoritettavan komentosarjan. Huomaa, että yhdistämiseen liittyy erityinen osa.
Perusrakenne
MERGE-käsky yhdistää INSERT-, DELETE- ja UPDATE-toiminnot yhdeksi taulukoksi. Kun ymmärrät, miten se toimii, huomaat, että se yksinkertaistaa menettelyä käyttämällä kaikkia kolmea lausetta erikseen tietojen synkronoimiseksi.
Alla on yhdistetyn käskyn yleinen muoto.
MERGE targetTableUsing sourceTableON mergeConditionWHEN MATCHEDTHEN updateStatementWHEN NOT MATCHED BY TARGETTHEN insertStatementWHEN NOT MATCHED BY SOURCETHEN deleteStatement
Yhdistämislauseke toimii kahdella taulukolla, sourceTable ja targetTable. TargetTable on muokattava taulukko sourceTable-taulukon sisältämien tietojen perusteella.
Kahta taulukkoa verrataan käyttämällä mergeCondition . Tämä ehto määrittää, miten sourceTable-taulukon rivit sovitetaan kohteeseen targetTable. Jos olet perehtynyt INNER JOINS -ohjelmaan, voit ajatella tätä liittymisehtona, jota käytetään rivien sovittamiseen.
Tavallisesti sovitat yksilöllisen tunnisteen, kuten ensisijaisen avaimen. Jos lähdetaulukko oli NewProduct ja target ProductMaster ja molempien ProductID: n ensisijainen avain, hyvä käytettävä yhdistämisehto olisi:
NewProduct.ProductID = ProductMaster.ProductID
Yhdistämisehdot yhdessä kolmesta tilasta: VASTAANOTETTU, EI VASTAAVA tai EI LÄHTEELLÄ.
Yhdistämisehdot
Mennään läpi, mitä eri olosuhteet tarkoittavat:
VASTAA – nämä ovat otteluedellytyksiä täyttäviä rivejä. Ne ovat yhteisiä sekä lähde- että kohdetaulukoille. Kaaviossa ne näkyvät vihreinä. Kun käytät tätä ehtoa sulautumislausekkeessa, eniten haluaisit päivittää kohderivisarakkeet sourceTable-sarakearvoilla.
EI VASTAA – Tätä kutsutaan myös nimellä EI VASTAA TAVOITE; nämä ovat lähdetaulukon rivejä, jotka eivät vastanneet yhtäkään kohdetaulukon rivejä. Näitä rivejä edustaa yllä oleva sininen alue. Useimmissa tapauksissa sitä voidaan päätellä, että lähdekentän rivit on lisättävä targetTable-taulukkoon.
EI VASTAA LÄHTEEN – nämä ovat kohdetaulukon rivejä, joita ei koskaan vastattu lähdetietueella; nämä ovat oranssin alueen rivejä. Jos tavoitteenasi on synkronoida targetTable-tiedot täysin lähteen kanssa, poista rivejä tämän vastaavuusehdon avulla.
Jos sinulla on vaikeuksia ymmärtää, miten tämä toimii, ota huomioon yhdistämisehto liittymisehto. Vihreän osan RIVIT edustavat rivejä, jotka vastaavat yhdistämisehtoa, sinisen osan rivit ovat SourceTable-taulukosta löytyviä rivejä, mutta ei kohdekohdasta. Oranssin osan rivit ovat vain kohdealueella olevia rivejä.
Anna nämä vastaavat skenaariot, jotta voit helposti lisätä, poistaa ja päivittää aktiviteetteja yhteen lausekkeeseen synkronoidaksesi muutokset kahden välillä. taulukot.
Katsotaanpa esimerkkiä.
YHDISTÄ Esimerkki
Oletetaan, että tavoitteemme on synkronoida esqlProductSourceen tehdyt muutokset esqlProductTargetin kanssa. Tässä on kaavio näistä kahdesta taulukosta:
Huomaa: Juoksin tämän esimerkin vuoksi komentosarjat, joista puhuin Johdannossa luodaan ja täytetään kaksi taulukkoa: esqlProductSource ja esqlProductTarget.
Ennen kuin muodostamme MERGE-käskyn, katsotaan miten synkronisimme taulukon käyttämällä UPDATE-, INSERT- ja DELETE-käskyjä muokkaamaan, lisäämään ja poista kohdetaulukon rivit.
Luulen, että kun näet, miten teemme tämän erikseen, yhdistämisen yhdeksi operaatioksi katsominen on järkevämpää.
Päivitä päivitykset muutosten synkronointiin yhdestä taulukosta seuraavaan
Päivittääksesi kohdetaulukon muutettuihin arvoihin lähteessä voimme käyttää UPDATE-käskyä. Koska ProductID on molempien taulukoiden ensisijainen avain, siitä on tullut paras valinta ottelurivejä taulukoiden välillä.
Jos päivitämme kohdetaulukon sarakearvot lähdesarakkeen avulla, voimme tehdä sen seuraavalla päivityslausekkeella
UPDATE esqlProductTargetSET Name = S.Name, ProductNumber = S.ProductNumber, Color = S.ColorFROM esqlProductTarget T INNER JOIN esqlProductSource S ON S.ProductID = T.ProductID
Tämä käsky päivittää esqlProductTarget-sarakkeen vastaavilla sarakearvoilla, jotka löytyvät esqlProductSource-sovelluksesta vastaavien tuotetunnusten kanssa.
INSERT -rivit löytyvät yhdestä taulukosta, mutta eivät muut
Katsotaan nyt, miten pystyy tunnistamaan lähdetaulukon rivit, jotka meidän on lisättävä tuotekohteeseen. Tätä varten voimme käyttää alikyselyä etsimään lähdetaulukon rivejä, jotka eivät ole kohdekohdassa.
INSERT INTO esqlProductTarget (ProductID, Name, ProductNumber, Color)SELECT S.ProductID, S.Name, S.ProductNumber, S.ColorFROM esqlProductSource SWHERE NOT EXISTS (SELECT T.ProductID FROM esqlProductTarget T WHERE T.ProductID = S.ProductID)
Huomaa: Voisin käyttää myös ulompaa liitosta tehdä sama. Jos olet kiinnostunut syystä, tutustu tähän artikkeliin.
Tämä lauseke lisää uuden rivin esqlProductTargetiin kaikilta esqlProductSource-riveiltä, joita ei löydy esqlProductTargetista.
Poistaminen Rivit
Tämä viimeinen synkronointitoiminto, joka meidän on tehtävä, poistaa kaikki kohdetaulukon rivit, jotka eivät ole SQL-lähdekoodissa. Aivan kuten teimme lisäyslausekkeen kanssa, käytämme alikyselyä. Mutta tällä kertaa löydämme esqlProductTarget-rivejä, joita ei löydy esqlProductSourcesta. Tässä on DELETE-käsky, jota voimme käyttää:
DELETE esqlProductTargetFROM esqlProductTarget TWHERE NOT EXISTS (SELECT S.ProductID FROM esqlProductSource S WHERE T.ProductID = S.ProductID)
Nyt kun olet nähnyt miten eri toiminnot tehdään yksitellen, voidaan nähdä miten ne kohtaavat yhdistämislauseke.
Huomaa, että suurin osa raskaasta nostosta tapahtuu yhdistämisehdon ja sen tulosten perusteella. Sen sijaan, että ottelu olisi asetettava toistuvasti, kuten teimme poistolausekkeessa, se tehdään kerran.
Vertaa uudelleen Lisää-käskyä yllä olevaan yhdistämislausekkeeseen.
INSERT INTO esqlProductTarget (ProductID, Name, ProductNumber, Color)SELECT S.ProductID, S.Name, S.ProductNumber, S.ColorFROM esqlProductSource SWHERE NOT EXISTS (SELECT T.ProductID FROM esqlProductTarget T WHERE T.ProductID = S.ProductID)
Kun MERGE-käsky määrittää lähde- ja kohdetaulukon sekä niiden yhteensopivuuden, kaikki punaisella merkityt värit ovat tarpeettomia; siksi, ei yhdistämisen lisäysosassa.
MERGE Changes -rekisteröinnin kirjaaminen OUTPUT-toiminnolla
Voit kirjata muutokset OUTPUT-lauseella. Tässä tapauksessa erityistä muuttujaa $ -toimintoa voidaan käyttää yhdistämistoiminnon kirjaamiseen. Tämä muuttuja käyttää yhtä kolmesta arvosta: ”INSERT”, ”UPDATE” tai ”DELETE”.
Jatkamme esimerkkimme käyttöä, mutta tällä kertaa kirjaamme muutokset ja tiivistämme muutokset.
Jos yllä olevat suoritetaan tuoreilla näytetiedoilla, luodaan seuraava yhteenveto: