कल्पना करें कि आपके पास दो अलग-अलग तालिकाएँ / क्वेरीज़ हैं जो समान डेटा के लिए / वापसी करने वाली हैं। आप इसे सत्यापित करना चाहते हैं। नीचे दिए गए उदाहरण की तरह हर तालिका से किसी भी बेजोड़ पंक्तियों को दिखाने के लिए हर कॉलम की तुलना करने का एक आसान तरीका है? मान लें कि तालिकाओं में 30 कॉलम हैं, जिनमें से कई NULLable हैं।
जब कोई पीके नहीं है या प्रति पीके डुप्लिकेट हो सकता है, तो सिर्फ पीके कॉलम में शामिल होना ही पर्याप्त नहीं है, और यह एक आपदा होगी जिसमें 30 जॉइन की शर्तों के साथ पूर्ण जॉइन करना होगा जो NULLs को ठीक से संभालेंगे, साथ ही एक बुरा स्थिति मिलान की गई पंक्तियों को बाहर करने के लिए।
आम तौर पर ऐसा तब होता है जब मैं अनसेबर्ड या नॉट-फुल-समझे गए डेटा के खिलाफ एक नई क्वेरी लिख रहा हूं कि समस्या सबसे खराब है और पीके के तार्किक रूप से उपलब्ध होने की संभावना बेहद कम है। मैं समस्या को हल करने के लिए दो अलग-अलग तरीके से खाना बनाता हूं और फिर उनके परिणामों की तुलना करता हूं, डेटा में विशेष मामलों को उजागर करने वाले अंतर जिनसे मैं अनजान था।
परिणाम को इस तरह देखना होगा:
Which Col1 Col2 Col3 ... Col30
------ ------ ------ ------ ------
TableA Cat 27 86 -- mismatch
TableB Cat 27 105 -- mismatch
TableB Cat 27 87 -- mismatch 2
TableA Cat 128 92 -- no corresponding row
TableB Lizard 83 NULL -- no corresponding row
यदि [Col1, Col2]
एक कम्पोजिट कुंजी होती है और हम अपने अंतिम परिणाम में उनके द्वारा ऑर्डर करते हैं, तो हम आसानी से देख सकते हैं कि ए और बी में एक पंक्ति अलग है जो समान होनी चाहिए, और प्रत्येक में एक पंक्ति है जो दूसरे में नहीं है।
उपरोक्त उदाहरण में, पहली पंक्ति को दो बार देखना वांछनीय नहीं है।
यहाँ नमूना तालिकाएँ और डेटा सेट करने के लिए DDL और DML है:
CREATE TABLE dbo.TableA (
Col1 varchar(10),
Col2 int,
Col3 int,
Col4 varchar(10),
Col5 varchar(10),
Col6 varchar(10),
Col7 varchar(10),
Col8 varchar(10),
Col9 varchar(10),
Col10 varchar(10),
Col11 varchar(10),
Col12 varchar(10),
Col13 varchar(10),
Col14 varchar(10),
Col15 varchar(10),
Col16 varchar(10),
Col17 varchar(10),
Col18 varchar(10),
Col19 varchar(10),
Col20 varchar(10),
Col21 varchar(10),
Col22 varchar(10),
Col23 varchar(10),
Col24 varchar(10),
Col25 varchar(10),
Col26 varchar(10),
Col27 varchar(10),
Col28 varchar(10),
Col29 varchar(10),
Col30 varchar(10)
);
CREATE TABLE dbo.TableB (
Col1 varchar(10),
Col2 int,
Col3 int,
Col4 varchar(10),
Col5 varchar(10),
Col6 varchar(10),
Col7 varchar(10),
Col8 varchar(10),
Col9 varchar(10),
Col10 varchar(10),
Col11 varchar(10),
Col12 varchar(10),
Col13 varchar(10),
Col14 varchar(10),
Col15 varchar(10),
Col16 varchar(10),
Col17 varchar(10),
Col18 varchar(10),
Col19 varchar(10),
Col20 varchar(10),
Col21 varchar(10),
Col22 varchar(10),
Col23 varchar(10),
Col24 varchar(10),
Col25 varchar(10),
Col26 varchar(10),
Col27 varchar(10),
Col28 varchar(10),
Col29 varchar(10),
Col30 varchar(10)
);
INSERT dbo.TableA (Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11, Col12, Col13, Col14, Col15, Col16, Col17, Col18, Col19, Col20, Col21, Col22, Col23, Col24, Col25, Col26, Col27, Col28, Col29, Col30)
VALUES
('Cat', 27, 86, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Cat', 128, 92, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Porcupine', NULL, 42, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Tapir', NULL, NULL, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0')
;
INSERT dbo.TableB (Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11, Col12, Col13, Col14, Col15, Col16, Col17, Col18, Col19, Col20, Col21, Col22, Col23, Col24, Col25, Col26, Col27, Col28, Col29, Col30)
VALUES
('Cat', 27, 105, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Cat', 27, 87, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Lizard', 83, NULL, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Porcupine', NULL, 42, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Tapir', NULL, NULL, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0');
SELECT ... EXCEPT ... SELECT
दूसरेSELECT
कथन के साथ लपेटें और तालिका नाम जोड़ें, अर्थातSELECT "table1", T1.* FROM (SELECT ... EXCEPT ... SELECT) T1
फिरUNION
क्वेरी के दूसरे आधे भाग के साथ।