2009-06-28 11 views
13

फर्जी शीर्षक के लिए पहली माफ़ी, मुझे बेहतर नहीं मिला।एसक्यूएल: कई से कई टेबल और क्वेरी

EmpID DeptID 

1  1 
1  2 
2  1 
3  2 
4  5 
5  2 

इस तालिका में अनेक-से-अनेक संबंध का प्रतिनिधित्व करता है:

मैं निम्नलिखित संरचना (सरलीकरण) के साथ तालिका है।

मुझे सभी एएमपीआईडी ​​खोजने में दिलचस्पी है जो कि डिप्टीड्स के एक विशिष्ट समूह से संबंधित हैं, उदाहरण के लिए मैं सभी एएमपीआईडी ​​चाहता हूं जो विभाग 1, 2 और 3 से संबंधित हैं। कृपया ध्यान दें कि यह एक और रिश्ते है और नहीं या रिश्ते मेरे मामले के लिए, एपीआईपी एक वैध उत्तर होने के लिए 1, 2 और 3 के अलावा अतिरिक्त विभागों से संबंधित हो सकता है।

परिवर्तनों में दिलचस्पी रखने वाले विभागों की संख्या (यानी मैं एम्पिड्स जो डेपिट 3 और 5 दोनों से संबंधित हो सकता हूं, या मैं एपीआईडीएस को 2, 3, 4, 5, 6, 7 से संबंधित चाहता हूं)।

जब मैं इस समस्या से संपर्क करने का प्रयास करता हूं तो मुझे लगता है कि मैं या तो प्रति व्यक्ति जॉइन बना रहा हूं, या प्रति विभाग एक सबक्वायरी। इसका मतलब यह होगा कि मुझे उन विभागों की संख्या के प्रति एक नई क्वेरी उत्पन्न करनी है जिनके खिलाफ मैं परीक्षण कर रहा हूं। मैं स्पष्ट रूप से पैरामीटर या पैरामीटर के सेट के साथ एक स्थिर क्वेरी होना पसंद करेंगे।

मैं SQL सर्वर और MySQL दोनों (मेरे कोड के समानांतर दो संस्करणों में विकसित) पर काम कर रहा हूं।

कोई विचार?

उत्तर

14

मैं तुम्हें कर्मचारियों है कि निर्दिष्ट विभागों के सभी में हैं और सिर्फ कर्मचारी नहीं है कि किसी भी विभागों, जो एक काफी आसान क्वेरी है की में ढूंढना चाहते हैं यह सोचते हैं रहा हूँ।

SELECT EmpID 
FROM mytable 
WHERE DeptID IN (1,2,3) 
GROUP BY EmpID 
HAVING COUNT(1) = 3 

कि प्रलोभन का विरोध:

SELECT EmpID 
FROM mytable t1 
JOIN mytable t2 ON t1.EmpID = t2.EmpID AND t2.DeptID = 2 
JOIN mytable t3 ON t2.EmpID = t3.EmpID AND t3.DeptID = 3 
WHERE DeptID = 1 

मैं अपरिहार्य सुझाव है कि एकत्रीकरण का उपयोग करने के लिए आया हूँ जगह ले लेना करने जा रहा हूँ। यह महत्वपूर्ण धीमा है। इस तरह का एक समान परिदृश्य SQL Statement - “Join” Vs “Group By and Having” में आया और दूसरा संस्करण उस दूसरे में था, लगभग बीस गुना धीमा

मैं आपको यह भी सुझाव दूंगा कि आप Database Development Mistakes Made by AppDevelopers देखें।

3

मैं की तरह कुछ से शुरू होगी:

SELECT EmpID, COUNT(*) AS NumDepts 
FROM thetable 
WHERE DeptID IN (1, 2, 3) 
GROUP BY EmpId 
HAVING COUNT(*) == 3 
निश्चित रूप से

, कि अंतिम पंक्ति में 3 हमेशा विभाग आईडी आप जाँच कर रहे हैं के अनुक्रम की लंबाई होगा (ताकि (2,3,4,5,6,7) के लिए यह होगा 6)। यह "इन सभी विभागों से जुड़े कर्मचारियों" को व्यक्त करने का एक प्राकृतिक तरीका है।

संपादित करें: मुझे प्रदर्शन समस्याओं के बारे में एक और उत्तर में एक नोट दिखाई देता है - मैंने उचित इंडेक्स के साथ SQLite और PostgreSQL में इस दृष्टिकोण को आजमाया है, और ऐसा लगता है कि यह अच्छा प्रदर्शन कर रहा है और सभी निर्दिष्ट सूचकांक के उचित उपयोग के साथ; और MySQL 5.0 में, जहां मुझे प्रदर्शन स्वीकार करना है, कहीं भी अच्छा नहीं था।

मुझे संदेह है (बिना किसी अरब इंजन पर बेंचमार्क करने का अवसर ;-) कि वास्तव में अन्य अच्छे SQL इंजन (जैसे SQL सर्वर 2008, ओरेकल, आईबीएम डीबी 2, नए ओपन-सोर्स इंग्रेस ...) इस क्वेरी को अच्छी तरह से अनुकूलित भी करेगा, जबकि अन्य औसत (किसी भी लोकप्रियता के साथ किसी भी चीज़ के बारे में नहीं सोच सकते हैं जो MySQL के करीब है) नहीं होगा।

तो, इसमें कोई संदेह नहीं है कि आपका पसंदीदा उत्तर इस बात पर निर्भर करेगा कि आप वास्तव में किस इंजन के बारे में परवाह करते हैं (यह मुझे एक दशक पहले वापस ले जाता है, जब मेरी जिम्मेदारियों में टीम का प्रबंधन शामिल था जो एक घटक को बनाए रखने वाला था आधे दर्जन से अधिक असमान इंजनों पर अच्छी तरह से प्रदर्शन करने वाले प्रश्न - दुःस्वप्न नौकरियों के बारे में बात करें ...! -)।

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