2012-10-29 10 views
9

मैं निम्न तालिकाओं है:एक बाएँ का उपयोग करना शामिल होने और यदि पंक्ति में एक और चेक के साथ ही अस्तित्व में जाँच जहां खंड

Users 
Banned 

SELECT u.* 
FROM Users 
WHERE u.isActive = 1 
    AND 
     u.status <> 'disabled' 

मैं किसी भी पंक्तियों जहां उपयोगकर्ता भी हो सकता है शामिल करने के लिए नहीं करना चाहते हैं प्रतिबंधित टेबल

ऐसा करने का सबसे अच्छा तरीका क्या है? मैं यह कैसे कर सकता है

u.status <> 'disabled' and not exist (SELECT 1 FORM Banned where userId = @userId) 

मुझे लगता है कि सबसे अच्छा तरीका है एक बायाँ शामिल हों ऐसा करने के लिए हो सकता है,:

मैं इस जहां खंड में एक सबक्वेरी डाल करता है तो यह की तरह कुछ कर सकता है?

उत्तर

19

this answer के अनुसार, एसक्यूएल-सर्वर में का उपयोग कर NOT EXISTSLEFT JOIN/IS NULL

तुलना में अधिक कुशल है
SELECT * 
FROM Users u 
WHERE u.IsActive = 1 
AND  u.Status <> 'disabled' 
AND  NOT EXISTS (SELECT 1 FROM Banned b WHERE b.UserID = u.UserID) 

EDIT

पूर्णता इस रखने के लिए कैसे मैं एक LEFT JOIN साथ यह करना होगा:

SELECT * 
FROM Users u 
     LEFT JOIN Banned b 
      ON b.UserID = u.UserID 
WHERE u.IsActive = 1 
AND  u.Status <> 'disabled' 
AND  b.UserID IS NULL  -- EXCLUDE ROWS WITH A MATCH IN `BANNED` 
+0

सहायक, प्रासंगिक और महत्वपूर्ण लेकिन सीधे सवाल का जवाब नहीं देता है। शायद रेडफिल्टर के जवाब को अपने आप में शामिल करें - ओपी * कैसे * चीजों को जिस तरीके से उसने पूछा, उसे दिखाएं, और फिर * समझाएं कि उसे क्यों नहीं करना चाहिए? –

+2

@ मार्क एमेरी, यह उत्तर लिंक एक उत्कृष्ट लेख को इंगित करता है, न कि मौजूदा बनाम बनाम बाएं जॉइन/आईएस न्यूल: एसक्यूएल सर्वर 'जो यहां एक उत्तर में संभव होगा, उससे अधिक विस्तार से आगे बढ़ता है। यह उत्तर स्पष्ट रूप से उस लंबे लेख को सारांशित करता है: 'EXIFSTS LEFT JOIN/IS NULL' –

+1

+1 @GarethD से अधिक कुशल नहीं है, मैं केवल बाएं जुड़ने का उपयोग करता हूं जब परिणाम तालिका में दाएं तालिका से डेटा लौटाया जाना चाहिए। यदि सही तालिका से डेटा वापस करने की आवश्यकता नहीं है, तो विरोधी अर्ध-संयोजक ऑपरेटरों का लाभ उठाएं और केवल अस्तित्व की जांच करें। – brian

5
select u.* 
from Users u 
left outer join Banned b on u.userId = b.userId 
where u.isActive = 1 
    and u.status <> 'disabled' 
    and b.UserID is null 
8

तुम बस की जाँच करेगा कि मूल्य आप LEFT JOIN से मिला साथ प्रतिबंध लगा दिया NULL था ing:

SELECT U.* 
FROM Users U 
    LEFT JOIN Banned B ON B.userId = U.userId 
WHERE U.isActive = 1 
    AND U.status <> 'disabled' 
    AND B.userId IS NULL -- no match in the Banned table. 
-1
SELECT u.* 
FROM Users u 
LEFT JOIN Banned b ON u.userId = b.userId AND b.userRoles = 'VIP' 
WHERE u.isActive = 1 AND b.id IS NULL 

इसका इस्तेमाल करता है, तो आप परिणाम और कुछ बाहर रखा जाना चाहिए की जरूरत है और यह मेज के लिए एक प्रमुख आईडी नहीं है ।

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