जवाबों:
कम स्तंभों जैसे तालिका वाले नल के लिए अतिरिक्त कॉलम जोड़ें
Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2, एक भी ऐसा कर सकते हैं Select *, Null as Col4, Null as Col5 from Table2।
मैं यहां आया और उत्तर के बाद। लेकिन डेटा प्रकार के क्रम में बेमेल त्रुटि हुई। एक अन्य उत्तर से नीचे का विवरण काम आएगा।
क्या आपकी तालिका में कॉलम के अनुक्रम के समान परिणाम ऊपर हैं? क्योंकि स्तंभ आदेशों में अलंकृत सख्त है। नीचे दिया गया यह उदाहरण एक त्रुटि उत्पन्न करता है:
create table test1_1790 (
col_a varchar2(30),
col_b number,
col_c date);
create table test2_1790 (
col_a varchar2(30),
col_c date,
col_b number);
select * from test1_1790
union all
select * from test2_1790;
ORA-01790: एक्सप्रेशन के समान एक्सप्रेशन के रूप में एक्सप्रेशन होना चाहिए
जैसा कि आप देखते हैं कि त्रुटि का मूल कारण बेमेल कॉलम ऑर्डरिंग में है जो कि * के रूप में कॉलम लिस्ट स्पेसियर के उपयोग से निहित है। इस प्रकार की त्रुटियों को कॉलम सूची में स्पष्ट रूप से दर्ज करके आसानी से टाला जा सकता है:
col_a, col_b, col_c का चयन test1_1790 संघ से करें, सभी select__1790 से col_a, col_b, col_c का चयन करें; इस त्रुटि के लिए एक अधिक लगातार परिदृश्य तब होता है जब आप अनजाने में स्वैप (या शिफ्ट) का चयन सूची में दो या अधिक कॉलम करते हैं:
select col_a, col_b, col_c from test1_1790
union all
select col_a, col_c, col_b from test2_1790;
या यदि उपरोक्त आपकी समस्या का समाधान नहीं करता है, तो कॉलम में ALIAS बनाने के बारे में इस तरह से है: (क्वेरी आपकी जैसी नहीं है, लेकिन यहां बिंदु कॉलम में उपनाम जोड़ने का तरीका है।)
SELECT id_table_a,
desc_table_a,
table_b.id_user as iUserID,
table_c.field as iField
UNION
SELECT id_table_a,
desc_table_a,
table_c.id_user as iUserID,
table_c.field as iField
जब आप सेट आधारित ऑपरेटरों का उपयोग कर रहे होते हैं, तो आम तौर पर आपको उसी संख्या में कॉलम की आवश्यकता होती है, इसलिए कंगण का उत्तर सही है।
SAS SQL में उस परिदृश्य को संभालने के लिए विशिष्ट ऑपरेटर है:
एसएएस (आर) 9.3 एसक्यूएल प्रक्रिया उपयोगकर्ता की गाइड
कोरपॉन्डिंग (कोर) कीवर्ड
CORRESPONDING कीवर्ड का उपयोग केवल तब किया जाता है जब एक सेट ऑपरेटर निर्दिष्ट किया जाता है। CORR का कारण PROC SQL नाम के अनुसार तालिका अभिव्यक्तियों में स्तंभों का मिलान करना है, न कि क्रमिक स्थिति से। जो कॉलम नाम से मेल नहीं खाते हैं, उन्हें परिणाम तालिका से बाहर रखा गया है, केवल OUTER UNION ऑपरेटर को छोड़कर।
SELECT * FROM tabA
OUTER UNION CORR
SELECT * FROM tabB;
के लिये:
+---+---+
| a | b |
+---+---+
| 1 | X |
| 2 | Y |
+---+---+
OUTER UNION CORR
+---+---+
| b | d |
+---+---+
| U | 1 |
+---+---+
<=>
+----+----+---+
| a | b | d |
+----+----+---+
| 1 | X | |
| 2 | Y | |
| | U | 1 |
+----+----+---+
यू-एसक्यूएल इसी तरह की अवधारणा का समर्थन करता है:
NAME ON (*) द्वारा OUTER UNION
बाहरी
BY NAME खंड और ON सूची की आवश्यकता है। अन्य सेट अभिव्यक्तियों के विपरीत, OUTER UNION के आउटपुट स्कीमा में दोनों तरफ से मेल खाने वाले कॉलम और नॉन-मैचिंग कॉलम शामिल हैं। यह एक ऐसी स्थिति बनाता है जहां एक तरफ से आने वाली प्रत्येक पंक्ति में "लापता कॉलम" होते हैं जो केवल दूसरी तरफ मौजूद होते हैं। ऐसे स्तंभों के लिए, "लापता कोशिकाओं" के लिए डिफ़ॉल्ट मानों की आपूर्ति की जाती है। डिफ़ॉल्ट मान अशक्त प्रकारों के लिए अशक्त हैं और गैर-अशक्त प्रकारों के लिए .Net डिफ़ॉल्ट मान (उदाहरण के लिए, 0)।
नाम से
OUTER के साथ उपयोग किए जाने पर आवश्यक है। खंड इंगित करता है कि संघ स्थिति के आधार पर नहीं बल्कि स्तंभों के नाम से मूल्यों का मिलान कर रहा है। यदि BY NAME क्लॉज निर्दिष्ट नहीं है, तो मिलान स्थिति के अनुसार किया जाता है।
यदि ऑन क्लॉज में "*" प्रतीक शामिल है (यह सूची के अंतिम या एकमात्र सदस्य के रूप में निर्दिष्ट किया जा सकता है), तो ऑन क्लॉज में उन से परे अतिरिक्त नाम मिलान की अनुमति है, और परिणाम के कॉलम में सभी मिलान कॉलम शामिल हैं आदेश वे बाएं तर्क में मौजूद हैं।
और कोड:
@result =
SELECT * FROM @left
OUTER UNION BY NAME ON (*)
SELECT * FROM @right;
संपादित करें:
बाहरी संघ की अवधारणा KQL द्वारा समर्थित है :
मेहरबान:
आंतरिक - परिणाम में उन कॉलमों का सबसेट होता है जो सभी इनपुट तालिकाओं के लिए सामान्य होते हैं।
बाहरी - परिणाम में सभी कॉलम हैं जो किसी भी इनपुट में होते हैं। ऐसी कोशिकाएं जिन्हें इनपुट पंक्ति द्वारा परिभाषित नहीं किया गया था, वे शून्य पर सेट हैं।
उदाहरण:
let t1 = datatable(col1:long, col2:string)
[1, "a",
2, "b",
3, "c"];
let t2 = datatable(col3:long)
[1,3];
t1 | union kind=outer t2;
आउटपुट:
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| 1 | a | |
| 2 | b | |
| 3 | c | |
| | | 1 |
| | | 3 |
+------+------+------+
यदि केवल 1 पंक्ति में, आप जुड़ने का उपयोग कर सकते हैं
Select t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Col5 from Table1 t1 join Table2 t2;