2010-09-01 11 views
10

उदाहरण के लिए मैं नहीं जानता कि कैसे प्रत्येक तालिका में कई पंक्तियों रहे हैं और मैं इस तरह से करने की कोशिश:इस्तेमाल किया SELECT स्टेटमेंट्स स्तंभों की एक अलग संख्या

SELECT * FROM members 
UNION 
SELECT * FROM inventory 

क्या मैं दूसरा SELECT को रख सकते हैं NULL जोड़ने के बिना इस त्रुटि को हटाने के बजाय *?

+6

आप दो अलग-अलग संदर्भों के दो तालिकाओं को क्यों जोड़ना चाहते हैं? – Joe

+2

आप उत्पादन पर चलने वाली किसी भी क्वेरी में चुनिंदा * का उपयोग कभी नहीं करते हैं। आपको हमेशा केवल कॉलम निर्दिष्ट करना चाहिए जो आपको बनाए रखने और प्रदर्शन दोनों के लिए आवश्यक हैं। – HLGEM

उत्तर

9

कॉलम नामों को स्पष्ट रूप से * के बजाय रखें, और सुनिश्चित करें कि कॉलम और डेटा प्रकारों की संख्या प्रत्येक चयन में एक ही कॉलम के लिए मेल खाती है।

अद्यतन:

मैं वास्तव में लगता है कि आप टेबल नामों के आधार पर उन तालिकाओं UNIONing जा करने के लिए, चाहते हैं। वे संबंधित डेटा नहीं लगते हैं। यदि आप अपनी स्कीमा पोस्ट करते हैं और वर्णन करते हैं कि आप इसे प्राप्त करने का प्रयास कर रहे हैं तो संभवतः हम बेहतर सहायता प्रदान कर सकते हैं।

+0

मुझे किसी भी नाम के बारे में कुछ नहीं पता, कुछ भी नहीं। क्या यह अभी भी संभव है? –

+0

यह क्यों कम किया गया था? –

+1

@hey: यूनियन क्वेरी लिखने से पहले कॉलम और उनके डेटा प्रकारों को जानने के लिए 'DESC your_table_name' का उपयोग करें। –

6

तुम कर सकते हो

SELECT * 
from members 
UNION 
SELECT inventory.*, 'dummy1' AS membersCol1, 'dummy2' AS membersCol2 
from inventory; 

कहाँ membersCol1, membersCol12, आदि ... members से कॉलम की ऐसे नाम हैं जो inventory में नहीं हैं। इस तरह संघ में दोनों प्रश्नों में एक ही कॉलम होंगे (मान लें कि inventory में सभी कॉलम members जैसा ही हैं जो मेरे लिए बहुत अजीब लगता है ... लेकिन हे, यह आपकी स्कीमा है)।

अद्यतन:

रूप HLGEM कहे अनुसार, इस होगा केवल काम करता है, तो inventorymembers रूप में एक ही नाम वाले स्तंभ हैं, और उसी क्रम में। सभी कॉलम का नामकरण स्पष्ट रूप से सबसे अच्छा विचार है, लेकिन चूंकि मुझे नाम नहीं पता है, इसलिए मैं वास्तव में ऐसा नहीं कर सकता। तो मैंने किया, यह कुछ इस तरह दिख सकता है:

SELECT id, name, member_role, member_type 
from members 
UNION 
SELECT id, name, '(dummy for union)' AS member_role, '(dummy for union)' AS member_type 
from inventory; 

मैं डमी मूल्यों के लिए शून्य का उपयोग कर क्योंकि तब यह हमेशा स्पष्ट नहीं है जो संघ एक रिकार्ड से आया है का हिस्सा पसंद नहीं है - 'डमी' का उपयोग कर यह बनाता है स्पष्ट करें कि रिकॉर्ड यूनियन के उस हिस्से से है जिसमें रिकॉर्ड नहीं था (हालांकि कभी-कभी इससे कोई फर्क नहीं पड़ता)। इन दो तालिकाओं को संघबद्ध करने का विचार मेरे लिए बहुत अजीब लगता है क्योंकि मुझे बहुत संदेह है कि उनके नाम के साथ 1 या 2 से अधिक स्तंभ होंगे, लेकिन आपने इस सवाल से इस तरह से पूछा कि मैं किसी भी तरह से अपने परिदृश्य में कल्पना करता हूं समझ में आता है।

+1

क्यों 'डमी 1' और 'डमी 2' के बजाय 'NULL' का उपयोग न करें? – dan04

+0

भले ही यह काम करेगा, फिर भी आपको कॉलम नाम निर्दिष्ट करने की आवश्यकता है क्योंकि कॉलम दोनों टेबलों पर एक ही क्रम में हो सकता है या नहीं हो सकता है (या हमेशा के लिए उसी क्रम में रहें)। इसके अलावा यदि सूची में एनोपर कॉलम जोड़ा गया था, तो संघ टूट जाएगा। कॉलम निर्दिष्ट किए बिना कभी भी यूएनओआईएन न करें। इसके अलावा सभी यूनियनों को यूनियनों के लिए कैंडीएट्स के रूप में माना जाना चाहिए, जो कि अधिक से अधिक प्रदर्शनकारी होते हैं यदि डुप्लिकेट की कोई संभावना नहीं है जिसे फ़िल्टर करने की आवश्यकता है। – HLGEM

+0

यह बताते हुए कि कुछ ऐसा कैसे करना है जो स्पष्ट रूप से गलत है, गरीब चाप को प्रश्न पूछने से चोट पहुंचाना, उसकी मदद नहीं करना। – ErikE

2

क्या आप वाकई इसके बजाय शामिल नहीं होना चाहते हैं? यह असंभव है कि यूएनओआईएन आपको वह टेबल देगा जो आप टेबल नाम दिए थे।

0

मैं नहीं जानता कि कैसे प्रत्येक तालिका में कई पंक्तियों

आप यकीन है कि यह आप क्या चाहते हैं नहीं है?

SELECT 'members' AS TableName, Count(*) AS Cnt FROM members 
UNION ALL 
SELECT 'inventory', Count(*) FROM inventory 
संबंधित मुद्दे