एक विकल्प निम्न रूप में दो तालिकाओं के बीच एक पूर्ण OOO 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 का उपयोग करना पड़ता है। इसके अतिरिक्त, यह किसी भी डेटाबेस के लिए काम करना चाहिए जो पूर्ण बाहरी जोड़ का समर्थन करता है (न कि सिर्फ पोस्टग्रैस्कल)।
मैं आमतौर पर इस्तेमाल करने वाले खंड का उपयोग करने को हतोत्साहित करता हूं, लेकिन यहां एक ऐसी स्थिति है जहां मैं इसे बेहतर दृष्टिकोण मानता हूं।
परिशिष्ट 2019-05-03:
यदि कोई संभावित अशक्त डेटा के साथ कोई समस्या है, (यानी आईडी कॉलम अशक्त नहीं है, लेकिन वैल है) तो आप निम्न कार्य नहीं कर सकते हैं:
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 में दो बड़े डेटा सेटों की तुलना करने का एक कुशल तरीका है