2012-07-28 8 views
10

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

CREATE TABLE test_table(
    k INTEGER, 
    v INTEGER 
); 

INSERT INTO test_table(k, v) VALUES(4, 5); 

SELECT * FROM(
    SELECT * FROM(
    SELECT k, v FROM test_table WHERE 1 = 0 
) 
    UNION ALL 
    SELECT * FROM(
    SELECT rowid, k, v FROM test_table 
) 
) 

sqlfiddle of above

मुझे लगता है कि होता है कि दो चयन जो स्तंभों की एक अलग संख्या है unioning एक त्रुटि लौट आते हैं। अगर मैं बाहरी SELECT * हटा देता हूं तो मुझे वह त्रुटि मिलती है जो मैं उम्मीद कर रहा हूं: SELECTs to the left and right of UNION ALL do not have the same number of result columns

+0

SQLite में एक मोड़ की तरह लग रहा है! – Andomar

+0

अजीब - और यह क्या लौटता है? गायब कॉलम के लिए एनयूएलएस? –

+0

ओह मैंने डेमो की जांच की और यह कॉलम को छोड़ देता है। –

उत्तर

10

इसका उत्तर सीधा लगता है: हाँ, यह एक quirk है। मैं इसे एक संक्षिप्त उदाहरण के साथ प्रदर्शित करना चाहता हूं। लेकिन पहले से, चलो documentation परामर्श करते हैं:

दो या दो से अधिक सरल SELECT स्टेटमेंट्स एक साथ जोड़ा जा सकता है बनाने के लिए एक यौगिक यूनिअन का उपयोग कर का चयन करें, यूनिअन सभी एक दूसरे को काटना या ऑपरेटर को छोड़कर। एक यौगिक चयन में, सभी घटक चयनों को परिणाम कॉलम की समान संख्या लौटा देना चाहिए।

तो दस्तावेज बहुत स्पष्ट रूप से कहते हैं कि दो SELECTs को कॉलम की एक ही संख्या प्रदान करनी होगी। हालांकि, जैसा कि आपने कहा था, बाहरी SELECT अजीब तरह से इस 'सीमा' से बचाता है।

उदाहरण 1

SELECT * FROM(
    SELECT k, v FROM test_table 
    UNION ALL 
    SELECT k, v,rowid FROM test_table 
); 

परिणाम:

k|v 
4|5 
4|5 

तीसरे स्तंभ rowid बस, लोप हो जाता है के रूप टिप्पणी में बताया।

उदाहरण 2

हम केवल दो का चयन करें बयान के आदेश करने जा रहे हैं।

SELECT * FROM(
    SELECT k, v, rowid FROM test_table 
    UNION ALL 
    SELECT k, v FROM test_table 
); 

परिणाम

k|v|rowid 
4|5|1 
4|5| 

अब, SQLite स्तंभ छोड़ नहीं करता है लेकिन एक अशक्त मूल्य जोड़ने।

निष्कर्ष

इससे मुझे अपने निष्कर्ष पर लाता है, कि SQLite बस UNION ALL अलग ढंग से हैंडल करता है, तो यह एक सबक्वेरी के रूप में संसाधित है।

पीएस: यदि आप केवल UNION का उपयोग कर रहे हैं तो यह किसी भी परिदृश्य में विफल रहता है।

7

यूनियन सभी अतिरिक्त कॉलम में नल मानों के साथ परिणाम वापस कर देंगे।

एक मूल यूनियन विफल हो जाएगा क्योंकि सभी के बिना यूनियन के दोनों टेबलों के समान कॉलम होना चाहिए।

तो:

SELECT column1, column2 FROM table a 
UNION ALL 
SELECT column1, column2, column3 FROM table b 

रिटर्न स्तंभ 3.

में nulls साथ 3 कॉलम और:

SELECT column1, column2 FROM table a 
UNION 
SELECT column1, column2, column3 FROM table b 

असफल चाहिए, क्योंकि स्तंभों की संख्या मेल नहीं खाते।

निष्कर्ष में आप यूनियन में एक खाली कॉलम जोड़ सकते हैं ताकि आप प्रत्येक तालिका से 3 कॉलम चुन रहे हों और यह अभी भी काम करेगा।

पूर्व:

SELECT column1, column2, '' AS column3 FROM table a 
UNION 
SELECT column1, column2, column3 FROM table b 
+0

अच्छा दृष्टिकोण !! –

संबंधित मुद्दे

 संबंधित मुद्दे