To pytanie zostało już zadane w przypadku przepełnienia stosu , ale tylko w przypadku MySQL. Używam PostgreSQL. Niestety (i zaskakująco) PostgreSQL nie wydaje się mieć czegoś takiego CHECKSUM table
.
Rozwiązanie PostgreSQL byłoby w porządku, ale ogólne byłoby lepsze. Znalazłem http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data , ale nie rozumiem zastosowanej logiki.
Tło: Ponownie napisałem kod generujący bazę danych, więc muszę sprawdzić, czy stary i nowy kod dają identyczne wyniki.
postgresql
duplication
Faheem Mitha
źródło
źródło
EXCEPT
, sprawdź to pytanie: Skuteczny sposób porównania dwóch dużych zestawów danych w SQLOdpowiedzi:
Jedną z opcji jest użycie PEŁNEGO POŁĄCZENIA ZEWNĘTRZNEGO między dwiema tabelami w następującej formie:
Na przykład:
Zwróci liczbę 2, podczas gdy:
zwraca oczekiwaną liczbę 0.
W tej metodzie podoba mi się to, że musi ona czytać każdą tabelę tylko raz, a nie czytać każdej tabeli dwa razy przy użyciu EXISTS. Dodatkowo powinno to działać dla każdej bazy danych, która obsługuje pełne sprzężenia zewnętrzne (nie tylko Postgresql).
Ogólnie odradzam stosowanie klauzuli USING, ale tutaj jest jedna sytuacja, w której uważam, że jest to lepsze podejście.
Dodatek 2019-05-03:
Jeśli występuje problem z możliwymi danymi zerowymi (tj. Kolumna id nie ma wartości zerowej, ale wartość val jest), możesz spróbować wykonać następujące czynności:
źródło
Możesz użyć
EXCEPT
operatora. Na przykład, jeśli tabele mają identyczną strukturę, poniższe zwrócą wszystkie wiersze, które są w jednej tabeli, ale nie w drugiej (więc 0 wierszy, jeśli tabele mają identyczne dane):Lub za pomocą,
EXISTS
aby zwrócić tylko wartość logiczną lub ciąg z jednym z 2 możliwych wyników:Testowany w SQLfiddle
Również nie
EXCEPT
usuwa duplikatów (nie powinno to stanowić problemu, jeśli tabele mają pewne ograniczeniaPRIMARY KEY
lubUNIQUE
ograniczenia, ale może tak być, jeśli porównujesz wyniki dowolnych zapytań, które potencjalnie mogą tworzyć duplikaty wierszy).Inną rzeczą, którą
EXCEPT
robi słowo kluczowe, jest to, że traktujeNULL
wartości jako identyczne, więc jeśli tabelaA
ma wiersz z,(1,2,NULL)
a tabelaB
ma wiersz z(1,2,NULL)
, pierwsze zapytanie nie wyświetli tych wierszy, a drugie zapytanie zwróci,'same'
jeśli dwie tabele nie mają innego wiersza.Jeśli chcesz policzyć takie wiersze jako różne, możesz użyć odmiany
FULL JOIN
odpowiedzi gsiems , aby uzyskać wszystkie (różne) wiersze:i uzyskać odpowiedź tak / nie:
Jeśli wszystkie kolumny dwóch tabel nie mają wartości zerowej, oba podejścia dadzą identyczne odpowiedzi.
źródło
SELECT <column_list> FROM a
zamiastTABLE a
EXCEPT
Zapytanie jest beaut!Potrzebujesz wyjątku Klauzula Coś podobnego
Zwraca wszystkie wiersze z pierwszej tabeli, które nie znajdują się w drugiej tabeli
źródło
Patrząc na połączony kod, którego nie rozumiesz:
Tajny sos używa
union
w przeciwieństwie dounion all
. Pierwszy zachowuje tylko odrębne wiersze, podczas gdy drugi zachowuje duplikaty ( odniesienie ). Innymi słowy, zagnieżdżone zapytania mówią „daj mi wszystkie wiersze i kolumny z EmpDtl1, a ponadto te z EmpDtl2, które nie są jeszcze w EmpDtl1”. Liczba tego podzapytania będzie równa liczbie EmpDtl1 wtedy i tylko wtedy, gdy EmpDtl2 nie wnosi żadnych wyników do wyniku, tj. Dwie tabele są identyczne.Alternatywnie, zrzuć tabele w sekwencji klawiszy do dwóch plików tekstowych i użyj wybranego narzędzia porównywania.
źródło
EmpDtl2
ma mniej wierszy niżEmpDtl1
i wszystkie istniejące wiersze istniejąEmpDtl1
.