Transact-SQL में सममित अंतर ऑपरेशन?


10

मैं हमेशा UNIONSQL में ऑपरेटर के बारे में जानता हूं , लेकिन हाल ही में पता चला कि अन्य सेट ऑपरेटर थे, INTERSECTऔर EXCEPT। मुझे ऐसा ऑपरेटर नहीं मिला है जो चौथा बड़ा सेट ऑपरेटर, सममित अंतर (उदाहरण के विपरीत INTERSECT) करता है।

ऐसा लगता है कि मैं कुछ का उपयोग करके वांछित आउटपुट प्राप्त कर सकता हूं

SELECT Field FROM A UNION SELECT Field FROM B 
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B

(यह मानकर कि मुझे पूर्ववर्ती अधिकार मिला है), या एक पूर्ण-विरोधी कार्य करके:

SELECT A.Field, B.Field
FROM A
FULL JOIN B ON B.Id = A.Id
WHERE B.Id IS NULL OR A.Id IS NULL

लेकिन वे दोनों गहन प्रश्नों की तरह दिखते हैं, विशेष रूप से अन्य तीन बुनियादी सेट संचालन की तुलना में। एसक्यूएल में एक सममित अंतर ऑपरेशन है और मैं इसे दस्तावेज में नहीं ढूंढ सकता हूं? या टी-एसक्यूएल में इसे लागू करने का एक "विहित" तरीका है?


2
(a EXCEPT b) UNION ALL (b EXCEPT a);अधिक कुशल हो सकता है।
ypercube y

@ypercube जो 3 जॉइन करता है या जॉइन जैसा ऑपरेशन करता है। मैं किसी भी कारण के बारे में सोच भी नहीं सकता कि यह एक पूर्ण जॉइन से अधिक कुशल हो सकता है।
usr

@usr यह वास्तव में 2 जॉइन-लाइक ऑपरेशन है, न कि 3. यूनियन ऑल बहुत कम महंगा ऑपरेशन। मैं सहमत हूं कि FULL JOINअधिक कुशल हो सकता है। परीक्षण से पता चल सकता है कि कौन सा सबसे अच्छा है। और हां, अगर प्रत्येक टेबल से अधिक / अलग कॉलम की जरूरत है, तो मेरा समाधान आसानी से विस्तार योग्य नहीं है।
ypercube y

जवाबों:


3

सभी सेट ऑपरेटरों को ऑपरेटरों से जुड़ने या शामिल होने के लिए अनुवादित किया जाता है। आप क्वेरी प्लान में इसे देख सकते हैं।

उस कारण के लिए पूर्ण बाहरी जुड़ाव जो आपके पास है वह सबसे कुशल है जो आप कर सकते हैं। अवहेलना, ज़ाहिर है, उम्मीद की दुर्लभ स्थिति जिसमें ऑप्टिमाइज़र एक बुरी योजना चुनता है और फिर से लिखना भाग्य के साथ बेहतर प्रदर्शन करने के लिए होता है। यह हमेशा हो सकता है।


यह समझ में आता है, हालाँकि, इसका कारण मुझे सेट ऑपरेटर्स का उपयोग करना पसंद है क्योंकि वे "अतिरिक्त कॉलम" नहीं बनाते हैं ... मैं इस तरह की चीजें कर सकता हूं SELECT Id FROM A WHERE <stuff> EXCEPT Select Id FROM A WHERE <other stuff>और एकल सूची प्राप्त कर सकता हूं Id। मैं यह पता नहीं लगा सकता कि ऐसा कैसे हो सकता है कि पूरी तरह से जुड़ने के लिए ... क्या मुझे केवल दो सेट Idकॉलम से निपटने और उन्हें एक साथ वापस करने की आवश्यकता है?
कुटलुइके जूल

आप कह सकते हैं ISNULL(a.Col, b.Col) AS Col। एक व्युत्पन्न तालिका या सीटीई में लपेटें और आप उस पर आगे के संचालन के लिए निर्धारित "तह" परिणाम का उपयोग कर सकते हैं। (Btw, मैं सहमत हूं कि सममित अंतर ऑपरेटर मौजूद होना चाहिए।)
यूएसआर

2
@MichaelEdenfield दूसरी ओर, जब आप अन्य स्तंभों का उपयोग करना चाहते हैं, तो उनकी तुलना / भिन्नता के बारे में क्या कहेंगे? आप ऐसा एक जोड़ के साथ कर सकते हैं लेकिन प्रतिच्छेदन / छोड़कर नहीं। इसलिए मैं कुछ मामलों में देख सकता हूं कि वास्तव में भिन्नता लंबे समय में बहुत अधिक जटिल होती जा रही है।
हारून बर्ट्रेंड

2

मुझे लगता है कि यह एक बहुत अच्छा समाधान है। यह सभी दो चयनों के बीच एक यूनियन का उपयोग करता है जिसमें एक्जिस्ट उप-प्रश्न नहीं होते हैं। संघ और छोड़कर के संयोजन से बेहतर है क्योंकि आप उन क्षेत्रों को शामिल कर सकते हैं जो प्रक्षेपण में मेल नहीं खाते हैं।

SELECT  'A' TableName, FileType FROM KFX_Inventory I 
    WHERE Not Exists (Select Top 1 1 from KFX_FileType FT WHERE FT.FileType = I.FileType)
UNION ALL
SELECT  'B', FileType FROM KFX_FILEType FT 
    WHERE Not Exists (Select Top 1 1 from KFX_Inventory I WHERE FT.FileType = I.FileType)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.