2010-01-23 17 views
18

पर शामिल है मुझे यकीन नहीं है कि मैंने तर्क में गलती की है या नहीं।आंतरिक मूल्य शून्य मूल्य

यदि मेरे पास कोई प्रश्न है और मैं एक शून्य मूल्य के साथ एक आंतरिक जुड़ाव करता हूं तो क्या मुझे हमेशा कोई परिणाम नहीं मिलेगा या क्या यह शामिल होने और सफल होने की अनदेखी करेगा? उदाहरण

user { id PK, name NVARCHAR NOT NULL, banStatus nullable reference } 

यदि मैं लिखता हूं और u.banStatus मुझे कोई पंक्ति नहीं मिलेगी?

select * from user as u 
join banstatus as b on u.banStatus=b.id 
where id=1 
+0

क्यों न सिर्फ कोशिश करें? –

+1

एनयूएलएल अनिर्धारित है, इसलिए यदि हमारे पास शून्य = नल है तो परिणाम हमेशा गलत होगा, क्योंकि हम दो अपरिभाषित मानों की तुलना कर रहे हैं। मुझे उम्मीद है कि यह आपकी क्वेरी का जवाब देगा –

+0

आपकी क्वेरी में भी एक त्रुटि है। आपके आईडी में फ़ील्ड 'आईडी' संदिग्ध है - यह' u.id' या 'b.id' हो सकता है। –

उत्तर

6

जब आप ऐसा करेंगे एक INNER JOIN, NULL मान कुछ भी साथ मेल नहीं खाते। एक दूसरे के साथ भी नहीं। यही कारण है कि आपकी क्वेरी किसी भी पंक्ति को वापस नहीं कर रही है। (Source)

44

यदि आप शून्य नहीं हैं तो आपको पंक्ति नहीं मिलती है क्योंकि न्यूल कुछ भी बराबर नहीं हो सकता है, यहां तक ​​कि न्यूल भी।

यदि आप इसे बाएं जॉइन में बदलते हैं, तो आपको पंक्ति मिल जाएगी।

एक आंतरिक के साथ

में शामिल होने:

select * from user as u 
join banstatus as b on u.banStatus=b.id 

1, '1', 1, 'Banned' 
एक छोड़ दिया साथ

में शामिल होने:

select * from user as u 
left join banstatus as b on u.banStatus=b.id 

1, '1', 1, 'Banned' 
2, 'NULL', , '' 

इस परीक्षण डेटा का उपयोग करना:

CREATE TABLE user (id int, banstatus nvarchar(100)); 
INSERT INTO user (id, banstatus) VALUES 
(1, '1'), 
(2, 'NULL'); 

CREATE TABLE banstatus (id int, text nvarchar(100)); 
INSERT INTO banstatus (id, text) VALUES 
(1, 'Banned'); 
+2

मुझे परीक्षण डेटा या किसी अन्य चीज की आवश्यकता नहीं थी, फिर एक रचना (हाँ आपको पंक्तियां नहीं मिलेंगी) लेकिन भविष्य के पाठकों के लिए अच्छा है। +1 स्वीकार करते हैं। –

5

इस nulls पर एक आंतरिक मिलती है (Oracle वाक्य रचना):

select * 
    from user 
     uu 
    join banstatus 
     bb 
    on uu.banstatus = bb.id 
     or 
     uu.banstatus is null and bb.id is null 
+0

तो यह तब शामिल होता है जब उपयोगकर्ता और बीबी शून्य होते हैं? दिलचस्प। आईडी कभी शून्य या 0 नहीं होगी। अगर मैंने लिखा है 'uu.banstatus = bb.id या uu.banstatus शून्य है' तो यह इसे अनदेखा कर देगा और इसमें शामिल होगा और मुझे 0 पंक्तियां नहीं देगी? क्या यह बाएं शामिल होने जैसा ही होगा? दिलचस्प। मुझे अब जवाब की आवश्यकता नहीं है, लेकिन यदि आप एक देने की तरह महसूस करते हैं तो मैं पढ़ूंगा। –

+1

नहीं, यह बाएं शामिल होने की तरह व्यवहार नहीं करेगा। यदि 'bb.id' कभी शून्य नहीं होता है, तो नती' uu.banstatus' के साथ परिणाम में कोई पंक्ति नहीं होगी। –

+0

+1। दिलचस्प पोस्ट: डी –

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