2010-11-01 19 views
15

मैं अपनी क्वेरी में आंतरिक शामिल हूं। मुझे परिणाम मिला है लेकिन मुझे नहीं पता था कि डेटा आउटपुट में कैसे आ रहा है। क्या कोई मुझे बता सकता है कि इनर डेटा से मेल खाता कैसे जुड़ता है। नीचे मैं एक छवि दिखा रहा हूं। दो टेबल हैं (एक या दो टेबल)।इनर इन इनर इनर

alt text

मेरे हिसाब से कि पहली पंक्ति यह मोहित होना चाहिए लेकिन उत्पादन different.Please मुझे बता रहा है।

अग्रिम धन्यवाद।

उत्तर

3

आप इसे सुलझाने के लिए यदि आप डेटा एक निश्चित तरीके से वापस आने के लिए करना चाहते हैं। जब आप कहते हैं कि आप पहली पंक्ति होने के लिए "Mohit" की अपेक्षा कर रहे हैं, तो मुझे लगता है कि आप कहते हैं कि "Mohit" [One] तालिका में पहली पंक्ति है। हालांकि, जब SQL सर्वर तालिकाओं में शामिल होता है, तो यह आपके द्वारा अपेक्षित क्रम में शामिल नहीं होता है।

यदि आप [One] से पहली पंक्ति वापस लौटने के लिए चाहते हैं, तो [One].[ID] द्वारा क्रमबद्ध करने का प्रयास करें। वैकल्पिक रूप से, आप order by किसी भी अन्य कॉलम कर सकते हैं।

+0

उत्तर के लिए धन्यवाद। मुझे आदेश के बारे में पता है लेकिन मैं जानना चाहता हूं कि आंतरिक आंतरिक रूप से कैसे काम करता है? –

+0

जब आप एक इनर जॉइन करते हैं, तो SQL सर्वर मेल खाने वाली पंक्तियों (नेस्टेड लूप, आदि) को खोजने का सबसे अच्छा तरीका निर्धारित करता है। इसके परिणामस्वरूप परिणामों की एक यादृच्छिक क्रम में परिणाम होता है। – dotariel

+2

कोई भी जानता है कि अगर मैं "आदेशित" होने के लिए मजबूर कर सकता हूं (विशेष रूप से SQLite के लिए)? –

3

अपनी पहली क्वेरी के अंत में ORDER BY ONE.ID ASC जोड़ें।

डिफ़ॉल्ट रूप से कोई ऑर्डरिंग नहीं है।

+0

पर क्लिक करते हैं, लेकिन उस समय तालिका से रिकॉर्ड्स का चयन करते समय डिफ़ॉल्ट आदेश "एएससी" – Vijjendra

+0

उत्तर के लिए धन्यवाद। मुझे पता है आदेश द्वारा लेकिन मैं जानना चाहता हूं कि आंतरिक आंतरिक रूप से कैसे काम करता है? –

+0

@ मोहित - 'जॉइन' करने के बाद कोई प्राकृतिक आदेश नहीं है। आपके द्वारा प्राप्त परिणाम सही थे, लेकिन अनियंत्रित थे। आपकी एकल तालिका 'SELECT' क्रम में है, यह शायद क्लस्टर्ड इंडेक्स की वजह से है। – JNK

9

SQL में, आउटपुट का क्रम परिभाषित नहीं किया जाता है जब तक कि आप इसे ORDER BY खंड में निर्दिष्ट नहीं करते हैं।

इस प्रयास करें:

SELECT * 
FROM one 
JOIN two 
ON  one.one_name = two.one_name 
ORDER BY 
     one.id 
+0

+1: 'ऑर्डर बाय' क्लॉज के साथ, ऑर्डर यादृच्छिक होने की संभावना नहीं है और अनुमानित होने की संभावना है (पर्याप्त जानकारी दी गई है) लेकिन बिंदु "आउटपुट परिभाषित नहीं है"। – onedaywhen

+0

उत्तर के लिए धन्यवाद। मुझे आदेश के बारे में पता है लेकिन मैं जानना चाहता हूं कि आंतरिक आंतरिक रूप से कैसे काम करता है? –

+0

अपनी क्वेरी के लिए योजना बनाएं (केवल क्वेरी विंडो में 'Ctrl-L' दबाएं), यह आपको एल्गोरिदम दिखाएगा। – Quassnoi

1

एसक्यूएल डिफ़ॉल्ट रूप से कोई ऑर्डरिंग वापस नहीं करता है क्योंकि यह इस तरह से तेज़ है। इसे पहले अपने डेटा से गुज़रना पड़ेगा और फिर तय करें कि क्या करना है।

आपको क्लॉज द्वारा ऑर्डर जोड़ने की ज़रूरत है, और शायद वह आदेश जिसके द्वारा आप कभी भी उम्मीद करते हैं। (, नामों में से एक नकली नहीं है इस प्रकार मुझे लगता था आप चाहते हैं One.ID)

select * From one 
inner join two 
ON one.one_name = two.one_name 
ORDER BY one.ID 
4

आपका मुख्य क्वेरी में SELECT * से बचें।

बचें डुप्लिकेट कॉलम: JOIN हालत One.One_Name सुनिश्चित करता है और two.One_Name बराबर होगा इसलिए आप SELECT खंड में दोनों वापस जाने के लिए की जरूरत नहीं है।

डुप्लिकेट कॉलम नामों से बचें: 'उपनाम' का उपयोग करके One.ID और Two.ID का नाम बदलें।

खंड से कॉलम नामों ('लागू होने पर' लागू होने पर) ORDER BY खंड जोड़ें।

सुझाई पुनर्लेखन:

SELECT T1.ID AS One_ID, T1.One_Name, 
     T2.ID AS Two_ID, T2.Two_name 
    FROM One AS T1 
     INNER JOIN two AS T2 
      ON T1.One_Name = T2.One_Name 
ORDER 
    BY One_ID; 
-1

हाँ मोहित smirkingman सही है। यहां तक ​​कि यदि आप बड़े डेटाबेस को गधे या डिस्प्ले करने के क्रम में आदेश निर्दिष्ट किए बिना खंड द्वारा ऑर्डर का उपयोग कर रहे हैं, तो आपको अप्रत्याशित उत्तर देने वाले

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