2010-07-03 14 views
7

में मैंकई तालिकाओं का चयन करें जब एक तालिका खाली MySQL

SELECT * FROM a, b 

करने के लिए कोशिश कर रहा हूँ हालांकि है, यह कुछ भी वापस नहीं करता है, तो तालिकाओं में से एक खाली है। मैं इसे कैसे बना सकता हूं ताकि यह 'ए' लौटाए, भले ही दूसरा खाली हो?

+2

http://dev.mysql.com/doc/refman/5.0/en/join.html आप के रूप उपयोग कर रहे हैं 'इनर जॉइन' जिसके परिणामस्वरूप एक्स * वाई रिकॉर्ड होते हैं, इसलिए यदि उनमें से 1 में 0 पंक्तियां हैं तो x * 0 = 0. –

उत्तर

19

from खंड में दो तालिकाओं का उपयोग कार्यात्मक एक cross join के बराबर है:

select * 
from A 
cross join 
     B 

यह बी में हर पंक्ति के लिए एक की एक पंक्ति रिटर्न जब बी खाली है, परिणाम भी खाली है। आप left join का उपयोग कर इसे ठीक कर सकते हैं। left join के साथ, यदि पंक्तियों में से कोई खाली है तो भी आप पंक्तियां वापस कर सकते हैं। उदाहरण के लिए:

select * 
from A 
left join 
     B 
on  1=1 

हालत 1=1 हमेशा सच है के रूप में, यह सिर्फ एक cross join तरह छोड़कर यह भी खाली टेबल के लिए काम करती है।

+0

एफवाईआई, "माईएसक्यूएल में, क्रॉस जॉइन इनर जॉइन के समकक्ष एक वाक्य रचनात्मक है (वे एक-दूसरे को प्रतिस्थापित कर सकते हैं) " –

+0

@ इमरे एल: दिलचस्प। यदि कोई 'ऑन-क्लॉज' नहीं है, तो भी संभवतः अभी भी स्पष्ट रूप से 'क्रॉस जॉइन' का उपयोग करने के लिए स्पष्ट है, भले ही MySQL उसी उद्देश्य के लिए 'आंतरिक शामिल' की अनुमति देता है! – Andomar

+0

हां। मैं व्यक्तिगत रूप से 'INNER' और 'CROSS' शब्दों को छोड़ना पसंद करता हूं, लेकिन जब मैं शामिल तालिका में कुछ स्थितियों का उपयोग करता हूं तो मुझे इनलाइन क्रॉस जॉइन का उपयोग करना पसंद नहीं है। –

1
SELECT * FROM a LEFT JOIN b ON a.ID = b.ID 

बी खाली होने पर भी सबकुछ वापस कर देगा।

+0

आपने माना है कि इसमें शामिल होने के लिए फ़ील्ड हैं, कोई सामान्य क्षेत्र नहीं हो सकता है। सामान्य क्षेत्रों के बिना यह काम नहीं कर सकता है। उत्तर में चालू 1 = 1 देखें। – strattonn

1

आपको बाएं शामिल होना चाहिए।

इस

SELECT * 
FROM A 
LEFT JOIN B ON A.ID = B.ID 

की तरह तो फिर तुम बी में एक में पंक्तियों और संबंधित पंक्ति प्राप्त करता है, तो मौजूद है।

+0

आपने माना है कि इसमें शामिल होने के लिए फ़ील्ड हैं, कोई सामान्य क्षेत्र नहीं हो सकता है। सामान्य क्षेत्रों के बिना यह काम नहीं कर सकता है। उत्तर में चालू 1 = 1 देखें। पूरे प्रश्न की कुंजी है, सामान्य क्षेत्रों के बिना खाली सेट में शामिल होना। – strattonn

+0

हां, आप सही हैं, उस स्थिति में एक क्रॉस जॉइन आवश्यक है या स्थिति 1 = 1 जो लगभग समान है। –

0

ऊपर वर्णित क्वेरी दोनों तालिकाओं में शामिल होने पर प्रदर्शित होता है यदि इसमें 2 रिकॉर्ड होते हैं और बी में 7 रिकॉर्ड होते हैं तो यह 7 * 2 = 14 रिकॉर्ड प्रदर्शित करता है। आपके मामले में तालिका में से एक खाली है (0 रिकॉर्ड के साथ), यह कोई डेटा प्रदर्शित नहीं करेगा। यदि आप अभी भी डेटा प्रदर्शित करना चाहते हैं और तालिकाओं का कोई संबंध नहीं है, तो आपको यह जांचने की आवश्यकता है कि दोनों तालिकाओं की संख्या 0 से अधिक है या नहीं। अन्यथा केवल एक तालिका से रिकॉर्ड प्रदर्शित करें जो खाली नहीं है।

1
SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id 
इस उदाहरण आईडी में

में शामिल होने के लिए सिर्फ उदाहरण नाम है कुंजी

+0

आपने माना है कि इसमें शामिल होने के लिए फ़ील्ड हैं, कोई सामान्य क्षेत्र नहीं हो सकता है। सामान्य क्षेत्रों के बिना यह काम नहीं कर सकता है।उत्तर में चालू 1 = 1 देखें। – strattonn

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