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):
(TABLE a EXCEPT TABLE b)
UNION ALL
(TABLE b EXCEPT TABLE a) ;
Lub za pomocą, EXISTS
aby zwrócić tylko wartość logiczną lub ciąg z jednym z 2 możliwych wyników:
SELECT CASE WHEN EXISTS (TABLE a EXCEPT TABLE b)
OR EXISTS (TABLE b EXCEPT TABLE a)
THEN 'different'
ELSE 'same'
END AS result ;
Testowany w SQLfiddle
Również nie EXCEPT
usuwa duplikatów (nie powinno to stanowić problemu, jeśli tabele mają pewne ograniczenia PRIMARY KEY
lub UNIQUE
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 traktuje NULL
wartości jako identyczne, więc jeśli tabela A
ma wiersz z, (1,2,NULL)
a tabela B
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:
SELECT *
FROM a NATURAL FULL JOIN b
WHERE a.some_not_null_column IS NULL
OR b.some_not_null_column IS NULL ;
i uzyskać odpowiedź tak / nie:
SELECT CASE WHEN EXISTS
( SELECT *
FROM a NATURAL FULL JOIN b
WHERE a.some_not_null_column IS NULL
OR b.some_not_null_column IS NULL
)
THEN 'different'
ELSE 'same'
END AS result ;
Jeśli wszystkie kolumny dwóch tabel nie mają wartości zerowej, oba podejścia dadzą identyczne odpowiedzi.
EXCEPT
, sprawdź to pytanie: Skuteczny sposób porównania dwóch dużych zestawów danych w SQL