Bir seçenek, aşağıdaki biçimde iki tablo arasında bir TAM OUTER JOIN kullanmaktır:
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 ;
Örneğin:
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 ;
Oysa 2 sayısı döndürür:
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 sayısının umudunu döndürür.
Bu yöntemle ilgili hoşuma giden şey, EXISTS kullanırken her bir tabloyu yalnızca bir kez okumak yerine her tabloyu iki kez okumak olması gerektiğidir. Ek olarak, bu, tam dış birleşmeleri destekleyen herhangi bir veritabanı için çalışmalıdır (sadece Postgresql değil).
Genellikle KULLANIM yantümcesinin kullanılmasını önermem ama bu daha iyi bir yaklaşım olduğuna inandığım bir durum.
Ek 2019-05-03:
Olası boş verilerle ilgili bir sorun varsa (yani, id sütunu geçersiz sayılmaz ancak val olur), sonra aşağıdakileri deneyebilirsiniz:
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
bu soruyu kontrol edin: