यदि "यूआईडी के लिए कोई पंक्ति नहीं है", और आप 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;
साथ ही, आपको ऑपरेटर प्राथमिकता
. (AND
OR
. से पहले बाइंड करता है )।
मैं IS DISTINCT FROM
. का उपयोग करता हूं !=
. के बजाय अंतिम WHERE स्थिति में क्योंकि, फिर से, login.access
हो सकता है NULL
, जो योग्य नहीं होगा।
हालांकि, चूंकि आप केवल तालिका 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
।