2009-09-14 6 views
6

मैं एक कर्मचारी बुकिंग आवेदन पर काम कर रहा हूं। मेरे पास दो अलग-अलग इकाइयां प्रोजेक्ट्स और उपयोगकर्ता हैं जिन्हें दोनों ने कौशल की एक चर संख्या निर्दिष्ट की है।SQL सर्वर 2008 में दो परिणामों में मानों का मिलान/तुलना कैसे करें?

मैं विभिन्न कौशल के साथ एक कौशल तालिका मिल गया है (स्तंभों: आईडी, नाम) मैं एक मेज कहा जाता UserSkills में उपयोगकर्ता कौशल रजिस्टर (दो विदेशी कुंजी कॉलम के साथ: fk_user और fk_skill) मैं परियोजना कौशल रजिस्टर ProjectSkills नामक एक और तालिका में (दो विदेशी कुंजी कॉलम के साथ: fk_project और fk_skill)।

एक परियोजना के लिए अपने कौशल को स्थापित करने के दौरान 6 अलग-अलग कौशल और उपयोगकर्ताओं की आवश्यकता हो सकती है।

मुश्किल हिस्सा तब होता है जब मुझे अपने कौशल के आधार पर अपने प्रोजेक्ट के लिए उपयोगकर्ताओं को ढूंढना होता है। मुझे केवल उन उपयोगकर्ताओं में रूचि है जो मिलते हैं जिनके पास परियोजना द्वारा आवश्यक सभी कौशल हैं। उपयोगकर्ताओं को आवश्यक होने के बाद अधिक कुशल होने की अनुमति है।

निम्नलिखित कोड काम करेंगे नहीं, (और यहां तक ​​कि अगर यह किया था, बहुत प्रदर्शन अनुकूल नहीं होगा), लेकिन यह मेरा विचार दिखाता है:

SELECT * FROM Users u WHERE 
    (SELECT us.fk_skill FROM UserSkills us WHERE us.fk_user = u.id) 
     >= 
    (SELECT ps.fk_skill FROM ProjectSkills ps WHERE ps.fk_project = [some_id]) 

मैं अपने खुद के समारोह बनाने कि लेता है के बारे में सोच रहा हूँ दो टेबल-वेरिएबल्स, और उसके बाद तुलना में काम कर रहे हैं (एक संशोधित इन-फ़ंक्शन की तरह), लेकिन मुझे एक ऐसा समाधान मिल जाएगा जो अधिक प्रदर्शन अनुकूल है।

मैं एसक्यूएल सर्वर 2008

मैं वास्तव में इस पर किसी भी विचार या सुझाव की सराहना करते हैं पर विकसित कर रहा हूँ। धन्यवाद!

उत्तर

6
SELECT * 
FROM Users u 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM ProjectSkill ps 
     WHERE ps.pk_project = @someid 
       AND NOT EXISTS 
       (
       SELECT NULL 
       FROM UserSkills us 
       WHERE us.fk_user = u.id 
         AND us.fk_skill = ps.fk_skill 
       ) 
     ) 
+1

OMG! आपने केवल 2½ मिनट के बाद सही उत्तर के साथ जवाब दिया! आप मेरे हीरो हैं! ;) यह स्टैक ओवरफ्लो पर मेरा पहला सवाल था, लेकिन निश्चित रूप से मेरा आखिरी नहीं ... धन्यवाद, आपकी मदद बहुत सराहना की है! –

+0

ज़ॉउंड्स। क्या ऐसी कोई वेबसाइट है जो सहसंबंधित सबक्वायरी के इस उपयोग के पीछे कैसे और क्या स्पष्ट करती है? –

+0

'@ फिलिप केली ': मैं वर्तमान में अलग-अलग' आरडीबीएमएस 'में' बाएं जॉइन/आईएस नल 'बनाम' नहीं 'बनाम' नहीं 'बनाम' नहीं 'पर लेखों की एक श्रृंखला लिख ​​रहा हूं। – Quassnoi

0
-- Assumes existance of variable @ProjectId, specifying 
-- which project to analyze 
SELECT us.UserId 
from UserSkills us 
    inner join ProjectSkills ps 
    on ps.SkillId = us.SkillId 
    and ps.ProjectId = @ProjectId 
group by us.UserId 
having count(*) = (select count(*) 
        from ProjectSkills 
        where ProjectId = @ProjectId) 

आप के रूप में मैं इसे माध्यम से चलाने के लिए कोई परीक्षण डेटा है एक डिबग इस परीक्षण करने के लिए, चाहते हैं। इसे अनुकूलित करने के लिए अनुक्रमण के लिए Ditto।

(अब पोस्ट करने के लिए, और देखते हैं अगर किसी को एक बेहतर तरीका के साथ आने रहा है - वहाँ अधिक सूक्ष्म और इस से प्रभावी कुछ होना चाहिए।)

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