ทางเลือกหนึ่งคือการใช้การเข้าร่วมแบบเต็มด้านนอกระหว่างสองตารางในแบบฟอร์มต่อไปนี้:
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 ไม่เป็นโมฆะ แต่เป็น val) คุณสามารถลองทำสิ่งต่อไปนี้:
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