स्तंभों की विभिन्न संख्याओं के साथ दो तालिकाओं को मिलाना


106

मेरे पास दो टेबल (टेबल ए और टेबल बी) हैं।

इनमें अलग-अलग कॉलम हैं - Say Table A में अधिक कॉलम हैं।

मैं इन दो तालिकाओं को कैसे जोड़ सकता हूं और उन स्तंभों के लिए अशक्त हो सकता है जो तालिका बी में नहीं है?

जवाबों:


216

कम स्तंभों जैसे तालिका वाले नल के लिए अतिरिक्त कॉलम जोड़ें

Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2

6
क्या नल स्तंभ के लिए डिफ़ॉल्ट मान भरने का कोई तरीका है?
हंस

3
@ हंस: आप कुछ भी कर सकते हैं जैसे कि स्तंभ (स्तंभ नाम, 0) कॉलम के रूप में या नाम (स्तंभ का नाम, '-') कॉलम के रूप में या कुछ इसी तरह का।
कंगण

3
मैंने महसूस किया कि यह समाधान सभी कॉलमों को सूचीबद्ध किए बिना भी काम करता है। तो के बजाय Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2, एक भी ऐसा कर सकते हैं Select *, Null as Col4, Null as Col5 from Table2
प्रतीक पटेल

अशक्त मूल्य के लिए, इस हैक ने मेरे लिए काम किया: डमीकोल्यूमेंट के रूप में 'समगरिंग'। मूल रूप से, आप बस NULL को कुछ मान से बदलते हैं। यह तब भी काम करता था जब समूह के साथ प्रयोग किया जाता था।
सौरभ जैन

8

मैं यहां आया और उत्तर के बाद। लेकिन डेटा प्रकार के क्रम में बेमेल त्रुटि हुई। एक अन्य उत्तर से नीचे का विवरण काम आएगा।

क्या आपकी तालिका में कॉलम के अनुक्रम के समान परिणाम ऊपर हैं? क्योंकि स्तंभ आदेशों में अलंकृत सख्त है। नीचे दिया गया यह उदाहरण एक त्रुटि उत्पन्न करता है:

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

मुझे एक ही चीज़ का उपयोग करना था, लेकिन मैंने गैर-नल स्तंभों के लिए a.col_name और b.col_name जोड़ दिए। अशक्त स्तंभों के लिए, मुझे उपयोग करना था: NULL AS col_name1, NULL AS col_name2, आदि
Scott R

1
नोट चयन * यूनिअन कई बार जंजीर हो सकता है; नोट हर फ़िल्टर क्लॉज़
mirekphd

1

जब आप सेट आधारित ऑपरेटरों का उपयोग कर रहे होते हैं, तो आम तौर पर आपको उसी संख्या में कॉलम की आवश्यकता होती है, इसलिए कंगण का उत्तर सही है।

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 |
+------+------+------+

डेमो


किसी भी विचार कैसे SQL में इसे प्राप्त करने के लिए ??
केतनवाघासिया

@KetanVaghasiya जहाँ तक मैं जानता हूँ कि केवल SAS SQL और U-SQL इस अवधारणा का समर्थन करते हैं।
लुकाज़ स्ज़ोज़ा

-1

यदि केवल 1 पंक्ति में, आप जुड़ने का उपयोग कर सकते हैं

Select t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Col5 from Table1 t1 join Table2 t2;

दो 1-पंक्ति तालिकाओं के संघ (प्रत्येक एक ट्यूपल के साथ दो बहु-संबंध) के परिणामस्वरूप परिणाम में दो पंक्तियाँ (ट्यूपल्स) होंगी। संबंधपरक बीजगणित में (जो कि SQL नहीं है) संघ परिणाम एक पंक्ति हो सकता है, हालांकि केवल अगर दो इनपुट संबंधों में एक समान टपल होता है, जैसे। एक-संबंध का आत्मसंघर्ष।
राबर्ट मोनफेरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.