Articles

Redgate Hub

Johdanto

on useita syitä, miksi taulukoita tai tuloksia voi joutua vertailemaan.

  • joskus on vain tiedettävä, sisältävätkö taulukot samaa vai erilaista tietoa; ei yksityiskohtia: vain kyllä vai ei. Tämä on tyypillistä testiväitteissä,joissa sinun tarvitsee vain tietää, tuottaako rutiinisi tai eräsi tuloksen oikeilla tiedoilla. kun annetaan erityisesti vales parametrit. Se on joko väärin tai oikein
  • silloin tällöin, sinun täytyy tietää, mitkä rivit ovat muuttuneet olematta ehkä tarkka siitä, mitkä sarakkeet ovat muuttuneet ja miten.
  • on aikoja, jolloin sinulla on suuri taulukko sekä sarakkeiden että rivien suhteen, ja tarvitset jotain, joka näyttää sinulle nimenomaan sarakkeet, jotka muuttivat niiden arvoa. Saatat myös haluta tämän jäljitettäessä vika rutiini, joka saattaa muuten vaatia sinua tuhlata aikaa skannaus ”silmällä”.

käsittelemme näitä kolmea melko erilaista tehtävää SQL: ssä

Jos kahdessa taulukossa on eri määrä rivejä, ne eivät tietenkään voi olla samat. On kuitenkin aikoja, jolloin sinun täytyy tietää, onko Table_B sisältää kaikki rivit Table_A, ilman eroja. Jos haluat lisätietoja, saatat jopa haluta tietää rivejä jommassakummassa taulukossa, jotka eivät ole yhteisiä, tai yhteisiä rivejä, kuten ensisijainen avain, jotka olivat erilaisia. Miksi tyytyä vertailemaan vain kahta pöytää? On olemassa tapoja verrata niin monta kuin tarvitset. (kuten esimerkiksi, kun vertaat metatietoja useissa tietokannan tilannekuvia). Kyllä, on olemassa monia muunnelmia

sinulla on työkaluja ja ominaisuuksia tehdä näitä juttuja, varmasti?

työkaluille kuten SQL Data Compare, TableDiff, tSQLt tai Change Data Capture on aina paikka. Paljon riippuu olosuhteista ja tehtävän tyypistä. Live-järjestelmän tietojen muutosten auditointien tekeminen on erillinen aihe, kuten myös taulukoiden ja tietokantojen synkronointi. XML-dokumenttien vertailu ei myöskään ole mahdollista. Käsittelemme puhtaasti taulukoiden tietojen rutiinivertailua

käytän mitä todennäköisimmin TSQL-tekniikoita taulukoiden vertailuun, kun:

kehittäminen…

tietokannan kehittämisen aikana saadaan paljon taulukoita vertailuun. Kyse ei ole vain isoista asioista: esimerkiksi jokainen taulukossa arvostettu funktio tarvitsee build scriptissä testivaljaita, jotka varmistavat, että se tekee mitä sinun mielestäsi pitäisi tehdä kaikissa ajateltavissa testiolosuhteissa, ja sisältää kaikki ikävät reunatapaukset, joissa testaajat ovat aiemmin napanneet sen. Jokainen tallennettu menettely tarvitsee testin varmistaa, että prosessi, että se suorittaa tekee juuri sitä, mitä on tarkoitettu eikä mitään muuta.

aikoinaan rakentamistoiminta oli melko verkkaista, mutta kun on öisin rakentamis-ja integrointitesti, on parasta automatisoida se kokonaan ja päästä urakasta eroon.

ETL

kun automatisoidaan datan lataamista järjestelmään, joudutaan usein testaamaan erilaisia olosuhteita. Täytyykö rivien olemassa olevia versioita päivittää ja uusia lisätä? Tarvitsetko ansan, joka estää päällekkäiset merkinnät tai jopa poistaa olemassa olevat merkinnät?

testitulosten määrittäminen.

Kaikki tämän artikkelin skriptit käyttävät taulukkoa kunnianarvoisasta PUBS-tietokannasta. Aiomme käyttää laatijat taulukko, mutta naudanlihan rivien määrä hieman 5000 jotta saada koko, joka on hieman realistisempi. Olen toimittanut taulukon lähteeksi artikkelin.

I then created a copy of the table …

1
2
3
4
5
6

SELECT * INTO authorsCopy
FROM authors
GO
ALTER TABLE dbo.autherscopy ADD restraint Pk_ Authorscopy PRIMARY KEY CLUSTERED
(au_id) on PRIMARY

GO

ja muutti sitten joitakin rivejä.

1
2
3
4

5

update authorscopy set address=stuff(address,1,1,”)
where au_id in (
select top 10 au_id
from authorscopy F
tilaus puhelimitse)

joten nyt kahden taulukon pitäisi olla pääosin samat muutamin pienin muutoksin osoitekentässä

testaus nähdäkseni, ovatko pöydät erilaisia.

joskus vain haluaa tietää, ovatko taulukot samoja. Yksi esimerkki tästä olisi TVF: n asianmukaisen toiminnan tarkistaminen vertaamalla sen tuloksia olemassa olevan taulukon tuloksiin oikeilla tuloksilla. Tavallinen tapa tähän on CHECKSUM()funktioryhmä SQL Server-palvelimessa, koska ne ovat hyvin nopeita.

käyttämällä tarkistussummia

voit käyttää BINARY_CHECKSUM funktiota tarkistamaan, ovatko taulukot samat: no, suurin piirtein samat. Se on nopea, mutta se ei ole täydellinen, kuten osoitan hetken kuluttua. Jos sinulla on sarja testejä, esimerkiksi se on yleensä riittävä.

if (
valitse checksum_agg(binary_checksum (*))
from the authors)= (
select checksum_agg(binary_checksum (*))
from authorscopy)
select ”they are probably the same”
else
select ”they are different”

/tr>

1
2
3
4

6
7
8
9

jotta tämä toimisi, pöytäsi ei saa olla TEXT, NTEXT, IMAGE or CURSOR (tai SQL_VARIANT minkään näistä tyypeistä kanssa) perustyyppinään. Nykyään tämä on yhä harvinaista, mutta jos sinulla on jonkinlainen komplikaatio, voit pakottaa minkä tahansa sarakkeen, jossa on yksi tuetuista tyypeistä, tuettuun tyyppiin. Käytännössä käytän yleensä rutiinia, joka tarkistaa metatiedot ja tekee tämän automaattisesti, mutta se ei ole kaunista.

toimivassa versiossa kannattaisi todennäköisesti määritellä sarakeluettelo, varsinkin jos joutuu tekemään eksplisiittisen pakotuksen tietotyypeistä, tai jos tarkastelee vain tiettyjä sarakkeita,

ei BINARY_CHECKSUM() eikä sen tavallinen sisar CHECKSUM() kerro täysin tarkasti, onko jokin muuttunut rivissä tai taulukossa. Osoitamme tämän tarkastelemalla englannin kielen yleisiä sanoja, jotka sisältyvät taulukkoon nimeltä CommonWords.. Luulisi, että heillä kaikilla olisi eri shekkisumma, mutta niin ei ole.

1
2
3
4
5
6
7
8

valitse merkkijono, binary_checksum(merkkijono) ”tarkistussummaksi”
from commonwords
where binary_checksum(string) in
(
valitse binary_checksum(string)
commonwords
group by binary_checksum(string)
having count (*) > 2)
järjestys BINARY_CHECKSUM(string)

… antaen tuloksen …

aseistettuna näillä tiedoilla voimme nopeasti osoittaa, että eri merkkijonoilla voi olla sama tarkistussumma

select binary_checksum (”Reed the nerd”),
binary_checksum (”sued the nest”),
BINARY_CHECKSUM(’stud the oust’)

1
2
3

All these will; have the same checksum, as would …

1
2
3

SELECT
BINARY_CHECKSUM(’accosted guards’),
BINARY_CHECKSUM(’accorded feasts’)

….sekä katsoo seuraavaa:

valitse binary_checksum (”this looks very much like the next”),
binary_checksum (”this looks very much like the next”),
binary_checksum (”this looks very much like the next”)

1
2
3

1
2

———– ———– ———–
-447523377 -447522865 -447654449

The sister function CHECKSUM()

1
2
3
4

SELECT CHECKSUM(’This looks very much like the next”),
CHECKSUM (”this looks very much like the next”),
CHECKSUM (”This looks very much like the Next”)

… toteaa niiden olevan kaikki samat, koska se käyttää nykyistä kollaatiota ja my tietokannan vertaileminen ei ole tapauskohtaista. CHECKSUM() pyrkii löytämään merkkijonoja, jotka ovat yhtä suuret tarkistussummassa, jos ne ovat yhtä suuret merkkijonovertailussa.

1
2

———– ———– ———–
-943581052 -943581052 -943581052

joten paras mitä voi sanoa on, että on hyvin todennäköistä, että taulukot ovat samat, mutta jos pitää olla täysin varma, niin käytä toista algoritmia.

Jos et välitä eroavaisuuksista tekstijonoissa, voit käyttää CHECKSUM() sijasta BINARY_CHECKSUM()

tämän tekniikan suuri arvo on se, että kun olet laskenut tarvitsemasi tarkistussumman, voit tallentaa sen arvona taulukon sarakkeeseen alkuperäisen taulukon sijaan Ja siten voit tehdä koko prosessin tasaiseksi nopeammin ja vähemmän aikaa. Jos säilytät CHECKSUM() palauttamaa tarkistussummaa, varmista, että tarkistat live-taulukkoa vastaan tarkistussumman, joka on luotu samalla vertailulla.

tässä on yksinkertainen esimerkki ” what ’s changed” – rutiinista.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

–luomme ”checksum” – taulukon ”lennossa” käyttäen select intoa.
valitse
au_ID,
BINARY_CHECKSUM(au_id, au_lname, au_fname, phone, , city, , zip, ) AS
INTO auchk
from authorscopy
ORDER BY au_ID
/* now we’ll put in araint just to check että emme ole voittaneet lotossa (hyvin epätodennäköistä, mutta ei täysin mahdotonta, että meillä on kaksi riviä, joilla on sama tarkistussumma) */
Alter Table AUCHK add constraint isitunique unique ()
update authorscopy set au_fname=’ Arthur’
where au_id=’ 327-89-2366 ’
select authorscopy.*
FROM authorscopy
INNER JOIN AuChk ON authorscopy.au_ID=AuChk.au_ID
WHERE <>BINARY_CHECKSUM(authorscopy.au_id, au_lname, au_fname, phone, , city, , zip, )

…which gives…

1
2
3

au_id au_lname au_fname phone address city state zip contract
———– ——— ——— ———— ————— ————- —– —– ——–
327-89-2366 Mendoza Arthur 529275-5757 15 Hague Blvd. Little Rock of 98949 1

ja sitten vain siistitään.

/ * ja me vain popsimme sen takaisin siihen, mitä se oli, osana teardownia * /
update authorscopy set au_fname=”Arnold”
where au_id= ”327-89-2366”

1
2
3

Toki liipaisinta voisi käyttää, mutta joskus saattaa haluta vain päivittäisen tai viikoittaisen raportin muutoksista ilman, että liipaisin tunkee taulukkoon.

XML

yksi yleinen mahdollisuus on vertailla kahden taulukon XML-versiota, koska tämä tekee datatyypin käännöksen merkkijonoiksi puolestasi. Se on tarkistussummaa hitaampi, mutta luotettavampi.

1
2
3
4
5
6
7
8
9
10

IF CONVERT(VARCHAR(MAX),(
SELECT *
FROM authors ORDER BY au_id FOR XML path, root))
=
CONVERT(VARCHAR(MAX),(
SELECT *
FROM authorscopy ORDER BY au_id FOR XMLpath, root))
SELECT ’they are the same’
ELSE
valitse”they are different”

Tässä voit määrittää vertailun tyypin määrittelemällä kollaasin.

tai voit tehdä tämän vertaamalla taulukoiden tietoja..

1
2
3
4
5
6
7
8
9
10

IF BINARY_CHECKSUM(CONVERT(VARCHAR(MAX),(
SELECT *
FROM authors ORDER BY au_id FOR XML path, root)))
=
BINARY_CHECKSUM (CONVERT(VARCHAR(MAX),(
SELECT *
FROM authorscopy ORDER BY au_id FOR XML path, root)))
SELECT ”they are pretty much the same”
ELSE
SELECT”they are different”SELECT” they are different ”

… laskemalla tarkistussumma taulukon XML-versiosta. Näin voit tallentaa vertailtavan taulukon tarkistussumman.

sen löytäminen, missä erot ovat taulukossa

yksinkertaisin tehtävä on, jos taulukoissa on sama määrä rivejä ja identtinen taulukkorakenne. Joskus haluat tietää, mitkä rivit ovat erilaisia ja mitkä puuttuvat. Teidän on tietenkin täsmennettävä, mitä tarkoitatte sanalla ”sama”, varsinkin jos taulukoissa on eri sarakkeet. Menetelmä, jonka valitset vertailuun, määräytyy yleensä näiden yksityiskohtien perusteella.

UNION ALL … ryhmä tekniikan mukaan

klassinen lähestymistapa taulukoiden vertailuun on käyttää UNION ALLSELECT väittämiä, jotka sisältävät vertailtavat sarakkeet, ja sitten GROUP BY nämä sarakkeet. Jotta tämä toimisi, täytyy GROUP BY olla sarake, jossa on yksilölliset arvot, ja ensisijainen avain sopii tähän. Kumpikaan taulukko ei ole sallittua kaksoiskappaleet. Jos niissä on eri rivimäärä, nämä näkyvät eroina.

valitse erillinen au_id

valitse au_id

valitse au_id

valitse au_id, au_lname, au_fname, puhelin, osoite, kaupunki, valtio, zip, sopimus

tekijöiltä
Union all
valitse au_id, au_lname, au_fname, phone, address, city, state, zip, contract
from authorsCopy) BothOfEm
GROUP BY au_id, au_lname, au_fname, phone, address, city, state, zip, contract
HAVING COUNT(*)<2) f
1
2
3
4
5
6
7
8
9
10
11
12
13

Jos jossakin taulukoista on kaksoiskappale, niin se antaa väärän tuloksen, kuten tässä, jossa on kaksi hyvin erilaista taulukkoa ja tulos kertoo, että ne ovat samat! Tästä syystä, se on hyvä idea sisällyttää sarake(t), jotka muodostavat ensisijainen avain, ja vain sisällyttää rivit kerran!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
select count(*), address_id,theaddress,thepostcode
from the
(
select Address_ID,TheAddress,ThePostCode
FROM
(
VALUES
(9, ”929 Augustine lane, Staple Hill Ward South Gloucestershire UK”,”BS16 4LL”),
(10, ”45 Bradfield road, Parwich Derbyshire UK”, ”DE6 1QN”)
) Tablea(Address_id,theaddress,thepostcode)
Union all
select ADDRESS_ID,theaddress,thepostcode
from
(
values
(8, ”the Pippins”, 20 Gloucester PL, CHIRTON Ward, Tyne &amp; Wear UK’,’NE29 7AD’),
(8, ”’The Pippins”, 20 Gloucester Pl, Chirton Ward, Tyne &amp; Wear UK’,’NE29 7AD’),
(9, ’929 Augustine lane, Staple Hill Ward South Gloucestershire UK’,’BS16 4LL’),
(10, ’45 Bradfield road, Parwich Derbyshire UK’,’DE6 1QN’)
) TableB(Address_ID,TheAddress,ThePostCode)
)f
GROUP BY Address_ID,TheAddress,ThePostCode
HAVING COUNT(*)<2

… giving …

1
2
3
4

TheCount Address_ID TheAddress ThePostCode
———– ———– ————————- ————
(0 riviä (s) vaikuttaa)

tekniikkaa voidaan käyttää useamman kuin kahden taulukon vertailuun. Sinun tarvitsee vainUNION ALL vertailtavia taulukoita ja muuttaaHAVING lauseke suodattamaan vain rivit, jotka eivät ole kaikissa taulukoissa.

käyttämällä paitsi

voit nyt käyttää paljon puhtaampaa ja hieman nopeampaa EXCEPT.

select * from authors
paitsi
select * from authorscopy

1
2
3

tämä näyttää kaikki kirjoittajien rivit, joita ei löydy authorscopysta. Jos ne ovat samat, se ei palauttaisi rivejä

1
2
3
4
5
6
7
8
9
10
11
12
13
14

au_id au_lname au_fname puhelinosoite kaupunkivaltio zip-sopimus
———– ———– ——— ———— ————————– ———– —– —– ——–
041-76-1076 Sosa Sonja 000-198-8753 29 Second Avenue Omaha CT 23243 0
187-42-2491 Mc Connell Trenton 0003090766 279 Hague Way San Diego NY 94940 1
220-43-7067 Fox Judith 000-137-9418 269 East Hague Street Richmond VA 55027 0
505-28-2848 Hardy Mitchell 001-2479822 73 Green Milton drive Norfolk wa 69949 1
697-84-0401 Montes Leanne 000-018-0454 441 East Oak Parkway San Antonio MD 38169 1
727-35-9948 Long Jonathon 000-8761152 280 Nobel Avenue Anchorage la null 1
875-54-8676 Stone Keisha 000-107-1947 763 White Fabien Way Fremont ND 08520 0
884-64-5876 Keller Steven 000-2787554 45 White Nobel Boulevard Milwaukee NY 29108 1
886-75-9197 Ellis Marie 001032-5109 35 East Second Boulevard Chicago IL 32390 1
975-80-3567 Salazar Johanna 001-028-0716 17 new boulevard Jackson ND 71625 0
(10 riviä(s) vaikuttaa)

käytän vain select * – sovellusta pitääkseni asiat yksinkertaisina artikkelia varten. Normaalisti listaisit kaikki sarakkeet, joita haluat vertailla.

Tämä toimii vain taulukoille, joissa on sama rivimäärä, koska jos tekijöillä olisi ylimääräisiä rivejä, se silti sanoisi niiden olevan erilaisia, koska kirjoittajien rivit, jotka eivät olleet authorscopyssa, palautettaisiin. Tämä johtuu siitä, että EXCEPT palauttaa kaikki erotetut arvot kyselystä EXCEPT operandista, joita ei löydy myös kyselystä oikealta

tämä toivottavasti osoittaa mitä tarkoitan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
div> SELECT Address_ID,TheAddress,ThePostCode
FROM
(VALUES
(9, ”929 Augustine lane, Staple Hill Ward South Gloucestershire UK”,”BS16 4LL”),
(10, ”45 Bradfield road, Parwich Derbyshire UK”, ”DE6 1QN”)
) TableA(ADDRESS_ID,TheAddress,Thepostcode)
paitsi
select ADDRESS_ID,theaddress,thepostcode from
(arvot
(8, ”The Pippins”, 20 Gloucester pl, chirton Ward, Tyne & wear UK”, ”NE29 7AD”),
(8, ””The Pippins”, 20 Gloucester pl, chirton Ward, Tyne & Wear UK’,’NE29 7AD’),
(9, ’929 Augustine lane, Staple Hill Ward South Gloucestershire UK’,’BS16 4LL’),
(10, ’45 Bradfield road, Parwich Derbyshire UK’,’DE6 1QN’)
) TableB(Address_ID,TheAddress,ThePostCode)

…yields …

1
2
3
4

Address_ID TheAddress ThePostCode
———– ———————————————- ———–
(0 krs (s) vaikuttaa)

…taas …

1
2
3
4
5
6
7
8
9
10
11
12
13
14

/td>

valitse Address_ID,Theaddress,ThePostCode FROM
(arvot
(8, ”The Pippins”, 20 Gloucester Pl, Chirton Ward, Tyne & Wear UK”,” NE29 7AD”),
(8,”The Pippins”, 20 Gloucester Pl, Chirton Ward, Tyne & wear UK”, ”NE29 7AD”),
(9, ”929 Augustine Lane, Staple Hill Ward South Gloucestershire UK”, ”BS16 4LL”),
(10, ”45 Bradfield Road, parwich Derbyshire UK”, ”de6 1QN”)
tableb(address_id,Theaddress,ThePostCode)
paitsi
valitse address_id,Theaddress,Thepostcode
FROM
(VALUES
(9,”929 Augustine lane, Staple Hill Ward South Gloucestershire UK”, ”BS16 4LL”),
(10, ”45 Bradfield road, Parwich Derbyshire UK”, ”DE6 1QN”)
) TableA(Address_ID,TheAddress,ThePostCode)

..results in …

1
2
3
4
5

Address_ID TheAddress ThePostCode
———– ————————————————————- ———–
8 ’The Pippins’, 20 Gloucester Pl, Chirton Ward, Tyne & Wear UK NE29 7AD
(1 row(s) affected)

tätä EXCEPT – ominaisuutta voi käyttää hyödyksi, jos haluaa erityisesti tarkistaa, että TableA sisältyy TableB. Joten jos taulukoissa on eri määrä rivejä, voit silti vertailla niitä.

kaikkia sarakkeita ei välttämättä kannata vertailla. Sinun tulisi aina määrittää ne sarakkeet, joita haluat verrata ”samuuden” määrittämiseksi. Jos haluaisi verrata esimerkiksi osoitetta, käyttäisi vain …

1
2
3

select address from authors
select address from authorscopy

ulomman liitoksen tekniikka

on olemassa myös ulomman liitoksen tekniikka. Tämä on yleisempi tekniikka, joka antaa sinulle lisää tiloja. Jos esimerkiksi käytät täyttä ulompaa liittymää, voit saada kumman tahansa taulukon vertaansa vailla olevat rivit. Tämä antaa sinulle ”ennen” ja ”jälkeen” näkymä muutoksia tietoihin. Sitä käytetään yleisemmin synkronoinnissa kertomaan, mitä rivejä poistetaan, lisätään ja päivitetään.

We’ll just use the technique to get the altered rows in authorsCopy

1
2
3
4
5
6
7
8
9
10
11
12
13

SELECT authors.au_id, authors.au_lname, authors.au_fname, authors.phone, authors.address, authors.city, authors.state, authors.zip, authors.sopimus
from authors
LEFT OUTER JOIN authorsCopy
on authors.au_ID = AuthorsCopy.au_ID
AND authors.au_lname =authorsCopy.au_lname
AND authors.au_fname =authorsCopy.au_fname
AND authors.au_fname = authorsCopy. au_fname
AND authors.phone =authorsCopy.puhelin
ja COALESCE(tekijät.address,”)=COALESCE (authorsCopy.address,”)
ja COALESCE(tekijät.city,”) =COALESCE (authorsCopy.city,”)
ja COALESCE(tekijät.state,”) =COALESCE (authorsCopy.tila,”)
ja COALESCE(tekijät.zip,”) =COALESCE (authorsCopy.zip,”)
ja tekijät.contract =authorsCopy.sopimus
missä authorsCopy.au_ID on NULL

Kuten huomaatte, tällä lähestymistavalla on vaikeuksia nollasarakkeiden kanssa, mutta se on yhtä nopea kuin muut ja antaa hieman monipuolisempaa vertailukohtaa.

taulukoiden välisten erojen Paikallistaminen

saattaa tarvita nopeaa tapaa nähdä, mikä sarake ja rivi on muuttunut. Hyvin nerokas tapa tehdä tämä julkaistiin äskettäin. Se käytti XML: ää. ”Vertaa taulukoita ja raportoi erot käyttämällä Xml Pivot tiedot ”(editor ’ s note: link deprecated). Se on nokkela, mutta liian hidas. Sama voidaan tehdä puhtaasti SQL. Pohjimmiltaan, teet sarake sarakkeelta vertailu tietoja perustuu ensisijainen avain, käyttäen avain / arvo pari. Jos teet koko pöydän kerralla, se on melko hidasta: paras kikka on tehdä tämä vain niillä riveillä, joilla tiedät eron olevan.

au_id varchar(11) ensisijainen avain) /*tässä on muuttuneiden rivien ensisijaiset avaimet * /
lisää INTO @Temp(au_ID) –determine which rivs have changed
SELECT au_ID
FROM –use the EXCEPT technique qhich is the quickest in our tests
(
SELECT au_id, au_lname, au_fname, phone, , city, state, zip,
tekijöiltä
paitsi
valitse au_id, au_lname, au_fname, phone, address, city, state, zip, Contract
from authorscopy
F–now we just select those columns that have changed
select lefthand.au_id,lefthand.name arvo alkuperäisenä, oikeakätisenä.value as changed
FROM (–now we just lay out the two tables as key value pairs, using the string version of the data
SELECT authors.au_id, ”au_lname” AS ”name”, au_lname AS ”value”

FROM authors INNER JOIN @Temp altered ON altered.au_id=authors.au_id

UNION
SELECT authors.au_id, ” au_fname ’nimellä’, au_fname ’arvolla’
from authors inner join @temp altered on altered.au_id=authors.AU_ID
Union
select authors.au_id, ’phone’, phone
from authors inner join @temp altered on altered.au_id=authors.au_id
UNION
SELECT authors.au_id, ”address”, address

from authors INNER JOIN @Temp altered on altered.au_id=authors.au_id

UNION
SELECT authors.au_id, ”City” AS ”name”, City AS ”value”
from authors INNER JOIN @Temp altered ON altered.au_id=authors.au_id
Union
select authors.au_id, ”State”, State
from authors inner Join @temp altered on altered.au_id=authors.au_id
Union
select authors.au_id, ”zip”, zip
FROM authors INNER JOIN @Temp altered on altered.au_id=authors.au_id
UNION
SELECT authors.au_id, ”contract”, CONVERT(CHAR(1),contract)
from authors INNER JOIN @Temp altered on altered.au_id=authors.au_id) LeftHand
INNER JOIN (
select authorscopy.au_id, ”au_lname” as ”Name”, au_lname as ”value”

from authorscopy inner join @temp altered on altered.AU_ID=authorscopy.au_id

Union
select authorscopy.au_id, ”au_fname”, au_fname
FROM authorsCopy INNER JOIN @Temp altered on altered.au_id=authorsCopy.au_id
UNION

SELECT authorsCopy.au_id, ”phone”, phone FROM authorsCopy INNER JOIN @Temp altered on altered.au_id=authorsCopy.au_id

UNION
select authorscopy.au_id, ’address’, address

from Authorscopy inner join @temp altered on altered.au_id=authorscopy.au_id

Union
select authorscopy.au_id, ”City” nimellä ”name”, kaupunki nimellä ”value”
FROM authorsCopy INNER JOIN @Temp altered on altered.au_id=authorsCopy.au_id
UNION

SELECT authorsCopy.au_id, ”State”, state FROM authorsCopy INNER JOIN @Temp altered on altered.au_id=authorsCopy.au_id

UNION
select authorscopy.au_id, ”zip”, zip
from Authorscopy inner join @temp altered on altered.au_id=authorscopy.au_id
Union
select authorscopy.au_id, ’sopimus’, CONVERT(CHAR (1),contract)
FROM authorsCopy INNER JOIN @Temp altered on altered.au_id=authorsCopy.au_id) rightHand
on lefthand.au_ID=righthand.au_ID
AND lefthand.name=righthand.name
missä vasemmalla.arvo<>oikeanpuoleinen.arvo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

64

esimerkissämme tämä antaisi:

1
2
3
4
5
6
7
8
9
10
11
12

au_id nimi alkuperäinen muutettu
———– ——– —————————- ————————————
041-76-1076 address 29 Second Avenue 9 Second Avenue
187-42-2491 address 279 Hague Way 79 Hague Way
220-43-7067 address 269 East Hague Street 69 East Hague Street
505-28-2848 address 73 Green Milton Drive 3 Green Milton Drive
697-84-0401 address 441 East Oak Parkway 41 East Oak Parkway
727-35-9948 address 280 Nobel Avenue 80 Nobel Avenue
875-54-8676 address 763 White Fabien Way 63 White Fabien way
884-64-5876 address 45 White Nobel Boulevard 5 white Nobel Boulevard
886-75-9197 address 35 East Second Boulevard 5 East Second Boulevard
975-80-3567 address 17 New Boulevard 7 New Boulevard

tällä tekniikalla muunnetaan taulukoiden rivit, joissa on eroja, Entity-attribute-value (EAV) – tauluksi, jotta rivin sisällä olevia eroja voidaan vertailla ja näyttää. Se tekee tämän vuorottelun UNIONing kunkin sarakkeen nimen ja merkkijonon arvon. Tämä tekniikka toimii parhaiten, jos ei ole suuri määrä eroja.

johtopäätökset

taulukoiden tai tulosten vertailuun ei ole olemassa yhtä ideaalista menetelmää. Yksi useista tekniikoista on merkityksellisin mihin tahansa tiettyyn tehtävään. Kaikki riippuu juuri siitä, millaisia vastauksia tarvitset ja minkälainen tehtävä on. Haluatko tarkistaa nopeasti, että taulukko ei ole muuttunut, vai haluatko tietää tarkalleen, mitä muutokset ovat? SQL on luonnollisesti nopea tässä tehtävässä ja taulukoiden ja tulosten vertailu on tuttu tehtävä monille tietokantakehittäjille.

Jos on yleissääntö, sanoisin, että eksploratiivinen tai ad-hoc-työ tarvitsee työkalun, kuten SQL Data Compare, kun taas rutiiniprosessi tietokannassa vaatii käsin leikattua SQL-tekniikkaa.

Vastaa

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