2012-11-29 27 views
6

मैं orgid = 2 पर डेटा प्राप्त करना चाहता हूं या uid के लिए कोई पंक्ति नहीं है। orgid एक integer है। IS NULL करने के लिए मुझे लगता है कि सबसे नज़दीकी चीज है लेकिन मुझे uid के लिए डेटा नहीं मिल रहा है जिसमें orgid पंक्ति नहीं है। कोई उपाय?क्वेरी जहां विदेशी कुंजी कॉलम हो सकता है NULL

select u.uid,u.fname,u.lname from u 
inner join u_org on u.uid = u_org.uid 
inner join login on u.uid = login.uid 
where u_org.orgid=2 or u_org.orgid is NULL 
and login.access != 4; 

मूल रूप से OR अगर u_org.orgid पंक्ति मौजूद नहीं है।

+1

मेरा अनुमान है ... आप कोष्ठक याद आ रहे हैं? इसके बजाए इसे आजमाएं: '(u_org.orgid = 2 या u_org.orgid पूर्ण है) और login.access! = 4' – Wolph

+0

इसके अलावा, आप इसे इस तरह हल भी कर सकते हैं:' COALESCE (u_org.orgid, 2) = 2' – Wolph

+0

@WoLpH - दोनों ने इसे हल नहीं किया। हो सकता है कि 'नल' गलत बात है? क्या यह शून्य है यदि पंक्ति डेटाबेस में मौजूद नहीं है? – user983223

उत्तर

6

यदि आपके पास "यूआईडी के लिए कोई पंक्ति नहीं है", और आप JOIN जैसे करते हैं, तो आपको परिणामस्वरूप कोई पंक्ति मिलती है। बजाय LEFT [OUTER] JOIN का उपयोग करें:

SELECT u.uid, u.fname, u.lname 
FROM u 
LEFT JOIN u_org o ON u.uid = o.uid 
LEFT JOIN login l ON u.uid = l.uid 
WHERE (o.orgid = 2 OR o.orgid IS NULL) 
AND l.access IS DISTINCT FROM 4; 

इसके अलावा, आप कोष्ठक मैं operator precedence की वजह से जोड़ा जाना चाहिए। (ANDOR से पहले बांधता है)।

मैं पिछले में IS DISTINCT FROM बजाय != का उपयोग कहां हालत क्योंकि, फिर से, login.accessNULL, जो योग्य नहीं हैं हो सकता है।

हालांकि, बाद से आप केवल मेज u के साथ शुरू से कॉलम में रुचि होने लगते हैं, इस विकल्प क्वेरी और अधिक सुरुचिपूर्ण होगा:

SELECT u.uid, u.fname, u.lname 
FROM u 
WHERE (u.uid IS NULL OR EXISTS (
    SELECT 1 
    FROM u_org o 
    WHERE o.uid = u.uid 
    AND o.orgid = 2 
    )) 
AND NOT EXISTS (
    SELECT 1 
    FROM login l 
    WHERE l.uid = u.uid 
    AND l.access = 4 
    ); 

यह वैकल्पिक अतिरिक्त लाभ दिया है, कि आप हमेशा मिलता एकu से पंक्ति, भले ही u_org या login में कई पंक्तियां हों।

+0

@Erwin_Brandstetter - धन्यवाद। – user983223