मैं 2 टेबल समूह और लोगचयन पंक्तियों किसी भी विदेशी कुंजी की जरूरत नहीं है कि जुड़ा हुआ
लोग ग्रुप है कि Group.GroupId (प्राथमिक कुंजी)
से जुड़ा हुआ है कि कैसे मैं समूहों का चयन कर सकते हैं कि डॉन कोई लोग नहीं हैं? T-SQL में और LINQ में
धन्यवाद
मैं 2 टेबल समूह और लोगचयन पंक्तियों किसी भी विदेशी कुंजी की जरूरत नहीं है कि जुड़ा हुआ
लोग ग्रुप है कि Group.GroupId (प्राथमिक कुंजी)
से जुड़ा हुआ है कि कैसे मैं समूहों का चयन कर सकते हैं कि डॉन कोई लोग नहीं हैं? T-SQL में और LINQ में
धन्यवाद
अद्यतन
मैं 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 लगता है:
मेरे पसंदीदा तरीका एक बाएँ विरोधी अर्ध में शामिल होने के लिए है।
मैंने डेटा की अनुपस्थिति की खोज के लिए विभिन्न क्वेरी रणनीतियों पर एक संपूर्ण लेख लिखा - यदि आप रुचि रखते हैं तो here देखें।
मुझे पता नहीं है कि अगर मैं EXISTS से अधिक सहज महसूस करता हूं, लेकिन फिर भी +1 करता हूं। –
+1, 'आईएस न्यूल' के लिए बाहरी शामिल होना और जांच करना निश्चित रूप से mysql में एक अच्छा प्रदर्शन करने वाला दृष्टिकोण है (यह सुनिश्चित नहीं है कि यह विभिन्न SQL सर्वर संस्करणों में 'EXERS नहीं' कहां प्रदर्शन के अनुसार तुलना करता है)। –
मुझे लगता है कि सबसे सरल समाधान है:
SELECT *
FROM GROUPS
WHERE GroupId NOT IN (SELECT DISTINCT GroupId FROM People)
जब 'लोगों' में कॉलम 'समूह आईडी' के लिए नल की अनुमति है, तो आपको क्वेरी को इस पर बदलना चाहिए: समूह * समूह से जहां समूह नहीं है (समूह से समूह समूह चुनें जहां समूह नहीं है) – breez
वाह इस महान है। धन्यवाद आपको सीपीयू आंकड़े कैसे प्राप्त हुए? –
एसक्यूएल सर्वर का प्रोफाइलर। यह आपको बताता है कि प्रत्येक क्वेरी ने कितने पढ़े और सीपीयू समय लिया (मैंने उन्हें एक-एक करके भाग लिया)। –