Articles

Redgate Hub

wprowadzenie

istnieje kilka powodów, dla których może być konieczne porównanie tabel lub wyników.

  • czasami wystarczy wiedzieć, czy tabele zawierają dane, które są takie same lub różne; brak szczegółów: po prostu tak lub nie. Jest to typowe w przypadku twierdzeń testowych, w których wystarczy wiedzieć, czy rutynowa lub partia daje wynik z odpowiednimi danymi. w przypadku dostarczenia określonych walców dla parametrów. Jest albo źle, albo dobrze
  • czasami musisz wiedzieć, jakie wiersze się zmieniły, nie zwracając uwagi na to, które kolumny się zmieniły i jak.
  • czasami masz dużą tabelę zarówno pod względem kolumn, jak i wierszy i potrzebujesz czegoś, co pokaże Ci kolumny, które zmieniły swoją wartość. Możesz również tego chcieć, gdy wyśledzisz błąd w rutynie, która w przeciwnym razie może wymagać marnowania czasu na skanowanie „na oko”.

zajmiemy się tymi trzema raczej różnymi zadaniami w SQL

Jeśli dwie tabele mają inną liczbę wierszy, nie mogą być oczywiście takie same. Są jednak chwile, kiedy musisz wiedzieć, czy Table_B zawiera wszystkie wiersze Table_A, bez różnic. Jeśli chcesz uzyskać więcej szczegółów, możesz nawet chcieć poznać wiersze w tabeli, które nie są wspólne, lub wiersze wspólne, jak wskazuje klucz podstawowy, które były różne. Po co porównywać tylko dwie tabele? Istnieją sposoby porównywania tyle, ile potrzebujesz. (na przykład podczas porównywania metadanych w kilku migawkach bazy danych). Tak, istnieje wiele odmian

masz narzędzia i funkcje, aby to zrobić, na pewno?

zawsze jest miejsce na narzędzia takie jak SQL Data Compare, TableDiff, tSQLt czy Change Data Capture. Wiele zależy od okoliczności i rodzaju zadania. Osobnym tematem jest problem przeprowadzania audytów zmian danych w systemie live, podobnie jak synchronizacja tabel i baz danych. Porównanie dokumentów XML jest również poza zakresem. Będziemy zajmować się wyłącznie rutynowym porównywaniem danych w tabelach

najprawdopodobniej użyję technik TSQL do porównywania tabel, gdy:

rozwijanie…

w trakcie tworzenia bazy danych porównuje się wiele tabel. To nie tylko wielkie rzeczy: każda funkcja wartościująca tabelę, na przykład, potrzebuje uprzęży testowej w skrypcie kompilacji, która upewnia się, że robi to, co uważasz, że powinna zrobić we wszystkich możliwych warunkach testowych, i obejmuje wszystkie paskudne przypadki, w których została złapana przez testerów w przeszłości. Każda procedura składowana wymaga testu, aby upewnić się, że proces, który wykonuje, robi dokładnie to, co jest zamierzone i nic więcej.

był czas, że budowa była raczej spokojna, ale kiedy masz nocny test budowania i integracji, najlepiej jest całkowicie zautomatyzować go i pozbyć się obowiązków.

ETL

Kiedy automatyzujesz ładowanie danych do systemu, często musisz przetestować różne warunki. Czy musisz aktualizować istniejące wersje wierszy, a także wstawiać nowe? Czy potrzebujesz pułapki, aby zapobiec duplikowaniu wpisów, a nawet usunąć istniejące wpisy?

Konfigurowanie danych testowych.

wszystkie skrypty w tym artykule używają tabeli z bazy danych czcigodnych pubów. Użyjemy tabeli autorów, ale zwiększymy liczbę wierszy nieco do 5000, aby uzyskać rozmiar, który jest nieco bardziej realistyczny. Podałem źródło tabeli z artykułem.

I then created a copy of the table …

1
2
3
4
5
6

SELECT * INTO authorsCopy
FROM authors
GO
ALTER TABLE dbo.authorsCopy dodaj ograniczenie PK_authorsCopy PRIMARY KEY CLUSTERED
(au_id) na PRIMARY
przejdź

, a następnie zmień niektóre wiersze.

1
2
3
4
5

update authorscopy set address=stuff(address,1,1,”)
gdzie au_id w (
wybierz top 10 au_id
z authorscopy f
Zamów przez telefon)

więc teraz dwie tabele powinny być zasadniczo takie same z kilkoma drobnymi zmianami w polu adresu

testowanie aby sprawdzić, czy tabele są różne.

czasami po prostu chcesz wiedzieć, czy tabele są takie same. Przykładem tego może być sprawdzenie, czy TVF działa poprawnie, porównując jego wynik z wynikiem z istniejącej tabeli z poprawnymi wynikami. Zwykle można to zrobić za pomocąCHECKSUM()grupy funkcji w SQL serverze, ponieważ są one bardzo szybkie.

używając sum kontrolnych

możesz użyć funkcjiBINARY_CHECKSUM , aby sprawdzić, czy tabele są takie same: cóż, mniej więcej takie same. Jest szybki, ale nie jest idealny, co zademonstruję za chwilę. Jeśli masz serię testów, na przykład jest to ogólnie wystarczające.

1
2
3
4
5
6
7
8
9

JEŚLI (
WYBIERZ KONTROLNY СУММУ_AGG(BINARNY SUMA KONTROLNA(*))
OD autorów)=(
WYBIERZ KONTROLNY СУММУ_AGG(BINARNY KWOTA(*))
Z authorscopy)
WYBIERZ „są prawdopodobnie takie same”
JESZCZE
WYBIERZ „są różne”

aby to działało, twoja tabela nie może mieć TEXT, NTEXT, IMAGE or CURSOR (lub SQL_VARIANT z żadnym z tych typów) jako typu podstawowego. W dzisiejszych czasach jest to coraz rzadsze, ale jeśli masz jakiekolwiek komplikacje, możesz zmusić dowolną kolumnę z jednym z nieobsługiwanych typów do obsługiwanego typu. W praktyce zazwyczaj używam procedury, która sprawdza metadane i robi to automatycznie, ale nie jest to ładne.

w wersji roboczej prawdopodobnie chcesz podać listę kolumn, zwłaszcza jeśli musisz wykonać jawny przymus typów danych lub jeśli sprawdzasz tylko niektóre kolumny,

ani BINARY_CHECKSUM() , ani jej zwykły siostrzany CHECKSUM() nie są całkowicie dokładne w informowaniu, czy coś się zmieniło w wierszu lub tabeli. Pokażemy to, patrząc na wspólne słowa języka angielskiego, zawarte w tabeli o nazwie CommonWords.. Można by oczekiwać, że wszystkie będą miały inną sumę kontrolną, ale tak nie jest.

1
2
3
4
5
6
7
8
9
WYBIERZ wiersz BINARNY KWOTĘ (wiersz), JAKO „sumy Kontrolnej”
Z ogólnych słów
GDZIE BINARNY SUMA KONTROLNA(wiersz) W
(
WYBIERZ BINARNY SUMĘ KONTROLNĄ(wiersz)
Z ogólnych słów
GRUPUJ WEDŁUG BINARY SUMY KONTROLNEJ(wiersz)
O ILOŚĆ(*) > 2)
ORDER BY BINARY_CHECKSUM(string)

… dając wynik …

uzbrojeni w te informacje, możemy szybko wykazać, że różne ciągi mogą mieć takie same suma kontrolna

1
2
3
wybierz binary_checksum(’Reed the nerd’),
binary_checksum(’sued the nest’),
BINARY_CHECKSUM(’stud the oust’)

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

1
2
3

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

….natomiast…

1
2
3

wybierz binary_checksum(’to wygląda bardzo podobnie do następnego’),
binary_checksum(’to wygląda bardzo podobnie do następnego’),
binary_checksum(’to wygląda bardzo podobnie do następnego’)

… daje różne sumy kontrolne w ten sposób…

1
2

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

The sister function CHECKSUM()

1
2
3
4

SELECT CHECKSUM(’This looks very much podobnie jak następne’),
suma kontrolna(’to wygląda bardzo podobnie do następnego’),
suma kontrolna(’to wygląda bardzo podobnie do następnego’)

… znajduje je wszystkie takie same, ponieważ używa bieżącego zestawienia i moje Zestawienie dla bazy danych jest niewrażliwe na wielkość liter. CHECKSUM() ma na celu znalezienie równych łańcuchów w sumie kontrolnej, jeśli są one równe w porównaniu łańcuchów.

1
2

———– ———– ———–możesz więc powiedzieć, że istnieje duże prawdopodobieństwo, że tabele będą takie same, ale jeśli chcesz mieć absolutną pewność, użyj innego algorytmu.

Jeśli nie masz nic przeciwko różnicy liter w ciągach tekstowych, możesz użyćCHECKSUM() zamiastBINARY_CHECKSUM()

wielką wartością tej techniki jest to, że po obliczeniu sumy kontrolnej, której potrzebujesz, możesz zapisać ją jako wartość w kolumnie tabeli zamiast oryginalnej tabeli i dlatego możesz wykonać cały proces jeszcze szybciej i mniej czasu. Jeśli przechowujesz wartość sumy kontrolnej zwracaną przez CHECKSUM(), upewnij się, że sprawdzasz przed tabelą live z sumą kontrolną wygenerowaną z tym samym zestawieniem.

Oto prosty przykład procedury „co się zmieniło”.

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

– stworzymy tabelę „sumy kontrolnej” „w locie” za pomocą przycisku „WYBIERZ”.
wybierz
au_ID,
BINARY_CHECKSUM(au_id, au_lname, au_fname, phone, , city, , zip, ) jako
do auchk
z authorscopy
Zamów przez au_ID
/* teraz wprowadzimy ograniczenie, aby sprawdzić że nie wygraliśmy loterii (bardzo mało prawdopodobne, ale nie całkowicie niemożliwe, że mamy dwa wiersze z tą samą sumą kontrolną) */
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. Mała Skała 98949 1

a potem po prostu posprzątamy.

1
2
3

/* i po prostu wracamy do tego, co było, w ramach teardown */
update authorscopy set au_fname=’Arnold’
gdzie au_id=’327-89-2366′

oczywiście możesz użyć wyzwalacza, ale czasami możesz chcieć tylko dziennego lub tygodniowego raportu zmian bez ingerencji wyzwalacza w tabelę.

Korzystanie z XML

jedną z ogólnych możliwości jest porównanie wersji XML obu tabel, ponieważ robi to tłumaczenie typu danych na ciągi znaków dla Ciebie. Jest wolniejszy niż suma kontrolna, ale bardziej niezawodny.

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
wybierz 'są różne’

tutaj możesz określić typ porównania, określając zestawienie.

lub możesz to zrobić, porównując dane w tabelach ..

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)))
wybierz 'są prawie takie same’
ELSE
wybierz 'są różne’ wybierz 'są różne’

… obliczając sumę kontrolną XML wersji tabeli. Pozwala to na przechowywanie sumy kontrolnej tabeli, z którą się porównujesz.

znalezienie różnic w tabeli

najprostszym zadaniem jest, gdy tabele mają identyczną liczbę wierszy i identyczną strukturę tabeli. Czasami chcesz wiedzieć, które wiersze są różne, a których brakuje. Musisz oczywiście określić, co masz na myśli przez „to samo”, szczególnie jeśli dwie tabele mają różne kolumny. Metoda, którą wybierzesz do porównania, jest zazwyczaj określana przez te szczegóły.

the UNION ALL … GROUP BY technique

klasycznym podejściem do porównywania tabel jest użycieUNION ALL dlaSELECT instrukcji zawierających kolumny, które chcesz porównać, a następnieGROUP BY tych kolumn. Oczywiście, aby to działało, musi istnieć kolumna z unikalnymi wartościami w GROUP BY, a klucz podstawowy jest idealny do tego. Żadna z tabel nie jest dozwolona jako duplikaty. Jeśli mają różną liczbę wierszy, pojawią się one jako różnice.

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

WYBIERZ indywidualny identyfikator użytkownika
Z
(
WYBIERZ IDENTYFIKATOR użytkownika
Z
(
WYBIERZ id użytkownika, nazwa użytkownika, nazwa użytkownika, numer telefonu, adres, miasto, stan, kod pocztowy, umowa
OD autorów
ZJEDNOCZENIE WSZYSTKICH
SELECT 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
mając COUNT(*)<2) F

Jeśli jedna z tabel ma duplikat, to daje fałszywy wynik, jak tutaj, gdzie masz dwie tabele, które są bardzo różne, a wynik mówi ci, że są one takie same! Z tego powodu dobrym pomysłem jest dołączenie kolumn (kolumn), które stanowią klucz podstawowy, i dołączenie wierszy tylko raz!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

WYBIERZ LICZBĘ(*), адрес_ид, adres, kod pocztowy
Z
(
WYBIERZ Adres_id,Adres,Kod Pocztowy
od
(
wartości
(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”, 2010 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

Adres_konstytucji_adres Kod Pocztowy
———– ———– ————————- ————
(dotyczy 0 wierszy)

technika ta może być użyta do porównywania więcej niż dwóch tabel. Musisz tylko UNION ALL tabele, które musisz porównać i zmienić HAVING klauzula, aby filtrować tylko wiersze, które nie są we wszystkich tabelach.

używając EXCEPT

Możesz teraz użyć znacznie czystszego i nieco szybszegoEXCEPT.

1
2
3

wybierz * od autorów
z wyjątkiem
wybierz * od autorów

pokazuje wszystkie wiersze autorów, których nie znaleziono w authorscopy. Jeśli są one takie same, nie odda wierszy

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

au_id имя_получателя имя_получателя имя_получателя telefonu, adres miasto województwo kod pocztowy umowy
———– ———– ——— ———— ————————– ———– —– —– ——–
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 Jonathan 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 Row(S) affected)

używam tylko select*, aby zachować prostotę artykułu. Zwykle wyszczególniasz wszystkie kolumny, które chcesz porównać.

To będzie działać tylko dla tabel z taką samą liczbą wierszy, ponieważ, jeśli autorzy mieli dodatkowe wiersze, nadal mówiłoby, że były inne, ponieważ wiersze w autorach, których nie było w authorsCopy, zostaną zwrócone. Dzieje się tak, ponieważ EXCEPT zwraca wszelkie różne wartości z zapytania po lewej stronie EXCEPT operand, które nie zostały znalezione również z zapytania po prawej

to, mam nadzieję, że pokazuje, co mam na myśli

1
2
3
4
5
6

7

8
9
10
11
12
13
14
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)
z wyjątkiem
select address_id,theaddress,thepostcode from
(values
(8, „’the Pippins”, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, 2009 PL, div>

(8,”’The Pippins”, 2010 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 …

…natomiast…

1
2
3
4

Address_ID TheAddress Kod Pocztowy
———– ———————————————- ———–
(dotyczy 0 wierszy)

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

WYBIERZ Adres_id,Adres,Kod Pocztowy Z
(wartości
(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)
z wyjątkiem
wybierz adres_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)

Ta funkcja EXCEPTmoże być wykorzystana, Jeśli szczególnie chcesz sprawdzić, czy TableAjest zawarta w TableB. Więc tam, gdzie tabele mają inną liczbę wierszy, nadal można je porównać.

możesz nie chcieć porównywać wszystkich kolumn. Należy zawsze określić te kolumny, które chcesz porównać, aby określić „identyczność”. Jeśli na przykład chcesz porównać adres, użyj …

1
2
3

wybierz adres z autorów
wybierz adres z autorscopy

technika łączenia zewnętrznego

istnieje również technika łączenia zewnętrznego. Jest to bardziej ogólna technika, która daje dodatkowe udogodnienia. Jeśli na przykład użyjesz pełnego połączenia zewnętrznego, możesz uzyskać niezrównane wiersze w każdej tabeli. Daje to Widok „przed” i ” po ” zmian w danych. Jest używany bardziej ogólnie w synchronizacji, aby powiedzieć, jakie wiersze należy usunąć, wstawić i zaktualizować.

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.contract
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.phone =authorsCopy.telefon
I COALESCE (autorzy.address,”)=COALESCE (autorscopy.adres,”)
I COALESCE (autorzy.city,”) =COALESCE (authorsCopy.city,”)
I COALESCE (autorzy.state,”) =COALESCE (authorsCopy.state,”)
I COALESCE (autorzy.zip,”) =COALESCE (autorscopy.zip,”)
I autorów.contract =authorsCopy.contract
gdzie authorsCopy.au_ID jest NULL

jak widać, istnieją trudności z kolumnami null w tym podejściu, ale jest tak szybki jak inne i daje raczej większą wszechstronność porównań.

lokalizowanie różnic między tabelami

możesz potrzebować szybkiego sposobu sprawdzenia, która kolumna i wiersz uległy zmianie. Bardzo pomysłowy sposób na to został opublikowany niedawno. Używał XML. „Porównaj tabele i zgłoś różnice za pomocą Xml do obracania danych” (uwaga edytora: link przestarzały). Jest sprytny, ale zbyt wolny. To samo można zrobić wyłącznie w SQL. Zasadniczo porównuje się dane w kolumnie po kolumnie w oparciu o klucz podstawowy, używając pary klucz/wartość. Jeśli robisz całą tabelę na raz, jest to raczej powolne: najlepszą sztuczką jest zrobienie tego tylko w tych wierszach, w których wiesz, że istnieje różnica.

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
określanie tabeli @temp(klucz podstawowy au_id varchar(11)) /*zawiera klucze podstawowe wierszy, które zostały zmienione */
wstaw Do @Temp(au_ID) –określ, które wiersze zostały zmienione
SELECT au_ID
FROM –użyj techniki EXCEPT qhich jest najszybszy w naszych testach
(
SELECT au_id, au_lname, au_fname, phone,, city, state, zip,
od autorów
z wyjątkiem
select au_id, au_lname, au_fname, phone, address, city, state, ZIP,contract
from authorscopy
)f–teraz wybieramy te kolumny, które się zmieniły
select lefthand.au_id, lefthand.name, lefthand. value as original, Righthand.wartość zmieniona
FROM (–teraz po prostu układamy dwie tabele jako pary wartości klucza, używając ciągów wersji danych
SELECT authors.au_id, 'au_lname’ jako 'name’,au_lname jako 'value’
FROM authors INNER JOIN @Temp altered ON altered.au_id=authors.au_id
UNION
SELECT authors.au_id, 'au_fname’ as 'name’,au_fname as 'value’
od autorów INNER JOIN @temp altered on altered.au_id=authors.AU_ID
Union
select authors.au_id, 'phone’,phone
od autorów 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.

z authorsCopy INNER JOIN @Temp altered ON altered.au_id=authorsCopy.au_id
UNION
SELECT authorsCopy.au_id, 'State’, state
z 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,’contract’, 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
I lefthand.name=righthand.name
gdzie lefthand.wartość<>wartość

w naszym przykładzie da to:

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

au_id oryginalna nazwa zmieniona
———– ——– —————————- ————————————
041-76-1076 adres 29 Druga avenue 9 Druga avenue
187-42-2491 adres 279 trybunał w Hadze droga 79 trybunał w Hadze droga
220-43-7067 adres 269 East Hague Street 69 East Hague Street
505-28-2848 adres 73 Green Milton Drive 3 Green Milton Drive
697-84-0401 adres 441 East Oak Parkway 41 East Oak Parkway
727-35-9948 adres 280 Nobel Avenue 80 Nobel Avenue
875-54-8676 adres 763 White Fabien Way 63 White Fabien way
884-64-5876 adres 45 White Nobel Boulevard 5 white nobel Boulevard
886-75-9197 adres 35 East Second Boulevard 5 East Second Boulevard
975-80-3567 adres 17 New Boulevard 7 New Boulevard

ta technika obraca wiersze tabel, które mają różnice w tabeli Entity-attribute-value (EAV), dzięki czemu różnice w wierszu mogą być porównywane i wyświetlane. Wykonuje ten obrót przez UNIONw nazwie i wartości ciągu każdej kolumny. Technika ta sprawdza się najlepiej tam, gdzie nie ma dużej liczby różnic.

wnioski

nie ma jednej idealnej metody porównywania danych w tabelach lub wynikach. Jedna z wielu technik będzie najbardziej odpowiednia dla każdego konkretnego zadania. Wszystko zależy od odpowiedzi, których potrzebujesz i rodzaju zadania. Czy potrzebujesz szybkiego sprawdzenia, czy tabela się nie zmieniła, czy musisz dokładnie wiedzieć, jakie są zmiany? SQL jest oczywiście szybki w wykonywaniu tego zadania, a porównywanie tabel i wyników jest znanym zadaniem dla wielu programistów baz danych.

Jeśli istnieje ogólna zasada, powiedziałbym, że praca eksploracyjna lub ad-hoc wymaga narzędzia takiego jak porównanie danych SQL, podczas gdy rutynowy proces w bazie danych wymaga ręcznie wyciętej techniki SQL.


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *