한 가지 옵션은 다음 형식으로 두 테이블간에 FULL OUTER JOIN을 사용하는 것입니다.
SELECT count (1)
FROM table_a a
FULL OUTER JOIN table_b b
USING (<list of columns to compare>)
WHERE a.id IS NULL
OR b.id IS NULL ;
예를 들면 다음과 같습니다.
CREATE TABLE a (id int, val text);
INSERT INTO a VALUES (1, 'foo'), (2, 'bar');
CREATE TABLE b (id int, val text);
INSERT INTO b VALUES (1, 'foo'), (3, 'bar');
SELECT count (1)
FROM a
FULL OUTER JOIN b
USING (id, val)
WHERE a.id IS NULL
OR b.id IS NULL ;
반면에 카운트는 2를 반환합니다.
CREATE TABLE a (id int, val text);
INSERT INTO a VALUES (1, 'foo'), (2, 'bar');
CREATE TABLE b (id int, val text);
INSERT INTO b VALUES (1, 'foo'), (2, 'bar');
SELECT count (1)
FROM a
FULL OUTER JOIN b
USING (id, val)
WHERE a.id IS NULL
OR b.id IS NULL ;
카운트 0에 대한 희망을 반환합니다.
이 방법에 대해 내가 좋아하는 것은 EXISTS를 사용할 때 각 테이블을 한 번만 읽는 것과 비교하여 각 테이블을 두 번만 읽는다는 것입니다. 또한 이것은 Postgresql뿐만 아니라 전체 외부 조인을 지원하는 모든 데이터베이스에서도 작동합니다.
나는 일반적으로 USING 조항의 사용을 권장하지 않지만 여기에 그것이 더 나은 접근법이라고 믿는 한 가지 상황이 있습니다.
부록 2019-05-03 :
가능한 null 데이터에 문제가있는 경우 (예 : id 열은 nullable이 아니지만 val은 is) 다음을 시도 할 수 있습니다.
SELECT count (1)
FROM a
FULL OUTER JOIN b
ON ( a.id = b.id
AND a.val IS NOT DISTINCT FROM b.val )
WHERE a.id IS NULL
OR b.id IS NULL ;
EXCEPT
다음 질문을 확인할 수 있습니다 . SQL에서 두 개의 큰 데이터 세트를 비교하는 효율적인 방법