2009-05-26 12 views
7

मैं 2 टेबल समूह और लोगचयन पंक्तियों किसी भी विदेशी कुंजी की जरूरत नहीं है कि जुड़ा हुआ

लोग ग्रुप है कि Group.GroupId (प्राथमिक कुंजी)

से जुड़ा हुआ है कि कैसे मैं समूहों का चयन कर सकते हैं कि डॉन कोई लोग नहीं हैं? T-SQL में और LINQ में

धन्यवाद

उत्तर

16

अद्यतन

मैं SQL सर्वर 2005 के माध्यम से ऐसा करने के लिए चार अलग अलग तरीकों चलाने के लिए और कार्य योजना लागू करके शामिल किया है।

-- 269 reads, 16 CPU 
SELECT * 
FROM Groups 
WHERE NOT EXISTS (
    SELECT * 
    FROM People 
    WHERE People.GroupId = Groups.GroupId 
); 

-- 249 reads, 15 CPU 
SELECT * 
FROM Groups 
WHERE (
    SELECT COUNT(*) 
    FROM People 
    WHERE People.GroupId = Groups.GroupId 
) = 0 

-- 249 reads, 14 CPU 
SELECT * 
FROM Groups 
WHERE GroupId NOT IN (
    SELECT DISTINCT GroupId 
    FROM Users 
) 

-- 10 reads, 12 CPU 
SELECT * 
FROM Groups 
    LEFT JOIN Users ON Users.GroupId = Groups.GroupId 
WHERE Users.GroupId IS NULL 

तो आखिरी वाला, जबकि तर्कसंगत रूप से चारों में से कम से कम पठनीय, सर्वश्रेष्ठ प्रदर्शन करता है।

यह मेरे लिए आश्चर्य की तरह कुछ आता है, और ईमानदारी से मैं अभी भी जहां कहीं भी सिंटैक्स नहीं चुनता हूं, क्योंकि मुझे लगता है कि यह अधिक स्पष्ट है - यह ठीक वैसे ही पढ़ता है जो आप करने की कोशिश कर रहे हैं।

SELECT g.* 
FROM  Groups g 
LEFT JOIN People p ON g.GroupID = p.GroupID 
WHERE  p.GroupID IS NULL 

मैं, यह सबसे intitive लचीला, और performant लगता है:

+0

वाह इस महान है। धन्यवाद आपको सीपीयू आंकड़े कैसे प्राप्त हुए? –

+0

एसक्यूएल सर्वर का प्रोफाइलर। यह आपको बताता है कि प्रत्येक क्वेरी ने कितने पढ़े और सीपीयू समय लिया (मैंने उन्हें एक-एक करके भाग लिया)। –

6

मेरे पसंदीदा तरीका एक बाएँ विरोधी अर्ध में शामिल होने के लिए है।

मैंने डेटा की अनुपस्थिति की खोज के लिए विभिन्न क्वेरी रणनीतियों पर एक संपूर्ण लेख लिखा - यदि आप रुचि रखते हैं तो here देखें।

+0

मुझे पता नहीं है कि अगर मैं EXISTS से अधिक सहज महसूस करता हूं, लेकिन फिर भी +1 करता हूं। –

+0

+1, 'आईएस न्यूल' के लिए बाहरी शामिल होना और जांच करना निश्चित रूप से mysql में एक अच्छा प्रदर्शन करने वाला दृष्टिकोण है (यह सुनिश्चित नहीं है कि यह विभिन्न SQL सर्वर संस्करणों में 'EXERS नहीं' कहां प्रदर्शन के अनुसार तुलना करता है)। –

2

मुझे लगता है कि सबसे सरल समाधान है:

SELECT * 
FROM GROUPS 
WHERE GroupId NOT IN (SELECT DISTINCT GroupId FROM People) 
+0

जब 'लोगों' में कॉलम 'समूह आईडी' के लिए नल की अनुमति है, तो आपको क्वेरी को इस पर बदलना चाहिए: समूह * समूह से जहां समूह नहीं है (समूह से समूह समूह चुनें जहां समूह नहीं है) – breez

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