Một tùy chọn là sử dụng FULL OUTER THAM GIA giữa hai bảng theo mẫu sau:
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 ;
Ví dụ:
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 ;
Sẽ trả về số lượng là 2, trong khi:
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 ;
trả về hy vọng cho số 0.
Điều tôi thích ở phương pháp này là nó chỉ cần đọc mỗi bảng một lần so với đọc mỗi bảng hai lần khi sử dụng EXISTS. Ngoài ra, điều này sẽ hoạt động cho bất kỳ cơ sở dữ liệu nào hỗ trợ các phép nối ngoài đầy đủ (không chỉ Postgresql).
Tôi thường không khuyến khích sử dụng điều khoản SỬ DỤNG nhưng đây là một tình huống mà tôi tin rằng đó là cách tiếp cận tốt hơn.
Phụ lục 2019-05-03:
Nếu có vấn đề với dữ liệu null có thể xảy ra, (tức là cột id không thể rỗng nhưng giá trị là) thì bạn có thể thử như sau:
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
, kiểm tra câu hỏi này: Một cách hiệu quả để so sánh hai tập dữ liệu lớn trong SQL