SQL में, UNION
खंड दो प्रश्नों के परिणामों को एक परिणाम सेट में जोड़ता है।
आप UNION
. का उपयोग कर सकते हैं ALL
. के साथ या बिना क्लॉज तर्क:
UNION ALL
- डुप्लीकेट शामिल हैं।UNION
- डुप्लीकेट शामिल नहीं हैं।
यह कैसे काम करता है, यह दिखाने के लिए नीचे कुछ बुनियादी उदाहरण दिए गए हैं।
नमूना तालिकाएं
मान लीजिए हमारे पास दो टेबल हैं:Cats
और Dogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
हम एक SELECT
. का उपयोग कर सकते हैं UNION
. के साथ स्टेटमेंट दोनों तालिकाओं के परिणामों को एक परिणाम सेट में संयोजित करने के लिए खंड।
UNION ALL
का उपयोग करने का उदाहरण
सबसे पहले, आइए UNION ALL
use का उपयोग करें ताकि इसमें डुप्लीकेट शामिल हों।
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
परिणाम:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
इस मामले में, सात पंक्तियों को वापस कर दिया जाता है। हम देख सकते हैं कि "Fetch" दो बार लौटाया जाता है। ऐसा इसलिए है क्योंकि Fetch नाम के दो कुत्ते हैं।
एक ही नाम की एक बिल्ली और एक कुत्ता भी है:शराबी।
ध्यान दें कि मैंने ऑपरेशन द्वारा लौटाए गए फ़ील्ड को नाम देने के लिए कॉलम उपनाम का उपयोग किया था। अगर मैंने ऐसा नहीं किया होता, तो परिणाम पहली क्वेरी से कॉलम नामों का उपयोग करता। उस स्थिति में, कॉलम हेडर को DogName
. कहा जाता PetName
. के बजाय ।
SELECT DogName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
परिणाम:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
आप अपनी क्वेरी में जो डेटा लौटा रहे हैं, उसके आधार पर यह स्वीकार्य हो भी सकता है और नहीं भी। हमारे मामले में, यह उचित नहीं है, क्योंकि सभी परिणाम कुत्ते नहीं होते हैं।
UNION
का उपयोग करने का उदाहरण
देखते हैं क्या होता है जब हम ALL
. को हटा देते हैं तर्क।
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;
परिणाम:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
इस बार केवल पाँच पंक्तियाँ लौटाई गई हैं। दोनों डुप्लीकेट हटा दिए गए हैं।
UNION
बनाम DISTINCT
ध्यान दें कि यह लागू करने के लिए अलग है DISTINCT
प्रत्येक व्यक्ति को SELECT
बयान। अगर हमने ऐसा किया होता, तो Fluffy को दो बार लौटा दिया जाता, क्योंकि ALL
केवल SELECT
. के लिए लागू होगा यह कथन कि इसके विरुद्ध लागू किया जा रहा है (सम्मिलित परिणामों के लिए नहीं)।
मेरा मतलब समझाने के लिए यहां एक उदाहरण दिया गया है।
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;
परिणाम:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
सभी क्वेरीज़ को समान संख्या में कॉलम लौटाने होंगे
जब आप UNION
. का उपयोग करते हैं खंड, प्रत्येक क्वेरी में समान संख्या में कॉलम होने चाहिए, और वे एक ही क्रम में होने चाहिए।
यदि नहीं, तो आपको एक त्रुटि मिलेगी।
SELECT CatName FROM Cats
UNION ALL
SELECT DogId, DogName FROM Dogs;
परिणाम:
Msg 205, Level 16, State 1, Line 1 All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
यह वह त्रुटि है जो SQL सर्वर असमान संख्या में स्तंभों का उपयोग करते समय लौटाता है। यह विशेष त्रुटि इंगित करती है कि वही प्रतिबंध INTERSECT
. पर भी लागू होता है और EXCEPT
ऑपरेटरों। आपके DBMS के आधार पर आपको प्राप्त होने वाला त्रुटि संदेश भिन्न हो सकता है।
डेटा प्रकार संगत होना चाहिए
समान संख्या में स्तंभों की आवश्यकता के अलावा, उन स्तंभों में संगत डेटा प्रकार होना चाहिए।
जरूरी नहीं कि वे समान डेटा प्रकार हों, लेकिन उन्हें संगत होने की आवश्यकता होगी। यही है, उन्हें निहित रूपांतरण के माध्यम से संगत होना चाहिए। यदि डेटा प्रकार मेल नहीं खाते हैं, तो डीबीएमएस को एक अंतर्निहित रूपांतरण करने में सक्षम होना चाहिए ताकि वे मेल खाते हों।
यदि नहीं, तो आपको एक त्रुटि मिलेगी।
SELECT CatName FROM Cats
UNION ALL
SELECT DogId FROM Dogs;
परिणाम:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value 'Meow' to data type int.
परिणामों का आदेश देना
यदि आप परिणामों को ORDER BY
. के साथ क्रमित करना चाहते हैं खंड, आपको इसे अंतिम क्वेरी पर रखना होगा। आप एक अलग ORDER BY
नहीं डाल सकते हैं प्रत्येक प्रश्न पर खंड, या उस मामले के लिए, कोई भी प्रश्न जो अंतिम नहीं है।
SQL सर्वर में ऐसा करने का प्रयास करते समय मुझे यह त्रुटि मिलती है:
SELECT DogName AS PetName
FROM Dogs
ORDER BY DogName
UNION ALL
SELECT CatName
FROM Cats;
परिणाम:
Msg 156, Level 15, State 1, Line 4 Incorrect syntax near the keyword 'UNION'.
इसलिए, अगर हम परिणामों का आदेश देना चाहते हैं, तो हमें कुछ इस तरह करना होगा:
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
ORDER BY PetName;
UNION
लागू करना दो से अधिक प्रश्नों के लिए
पिछले उदाहरण दो अलग-अलग प्रश्नों के परिणाम मिलाते हैं, लेकिन आपको और जोड़ने से रोकने के लिए कुछ भी नहीं है। यदि आवश्यक हो तो आप कई प्रश्नों के परिणामों को संयोजित करने के लिए इसका उपयोग कर सकते हैं।
उदाहरण के लिए, यदि हमारे पास Birds
भी है तालिका, हम यह कर सकते हैं:
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
UNION ALL
SELECT BirdName
FROM Birds;
सामान्यीकरण
इस पृष्ठ के उदाहरणों में बिल्लियों और कुत्तों को दो अलग-अलग तालिकाओं में रखा गया है। मैंने ऐसा इसलिए किया क्योंकि यह स्पष्ट और संक्षिप्त तरीका है कि कैसे UNION
काम करता है।
व्यवहार में, आपके पास ये एक ही तालिका में हो सकते हैं, जैसे Pets
, फिर एक अलग PetTypes
रखें तालिका (या समान)। इसे सामान्यीकरण के रूप में जाना जाता है, और जिस तरह से संबंधपरक डेटाबेस आमतौर पर डिज़ाइन किए जाते हैं।
फिर आप आवश्यकतानुसार डेटा वापस करने के लिए इन तालिकाओं पर एक जॉइन चला सकते हैं।