2012-09-25 13 views
5

मेरे पास इस तरह की तालिका है।एसक्यूएल का चयन करें जहां खंड

PersonID, KvalifikationId 
1   1 
1   2 
1   3 
2   1 
2   3 

मैं सभी व्यक्तियों, कि नहीं kvalifikation 2.

मैंने लिखा

SELECT DISTINCT PersonID where NOT KvalifikationID = 2 

लेकिन इस वापसी दोनों व्यक्ति 1 और व्यक्ति 2. मैं कैसे कर लौटने एसक्यूएल querye लिखना चाहते हैं चयन करें कि केवल व्यक्ति को वापस कर दें ID का कैवल 2 नहीं है?

उत्तर

7

इस प्रयास करें,

SELECT DISTINCT PersonID 
FROM tableName 
WHERE PersonID NOT IN 
    (
     SELECT PersonID 
     FROM tableName 
     WHERE KvalifikationId = 2 
    ) 

SQLFiddle Demo

+0

टाई ठीक काम करता है। –

+0

@ सर्कफेस आपका स्वागत है! –

3
SELECT DISTINCT person_id 
FROM tableName t1 
WHERE not exists 
(
    select 1 
    from tableName 
    where person_id = t1.person_id and KvalifikationId = 2 
) 
3
Declare @t table(PersonID int,KvalifikationId int) 
Insert Into @t Select 1 ,1 
Insert Into @t Select 1, 2 
Insert Into @t Select 1,3 
Insert Into @t Select 2 ,1 
Insert Into @t Select 2,3 

Select PersonId From @t 

Except 

Select PersonID From @t where KvalifikationId = 2 

परिणाम

PersonId 
2 
-1

इस प्रयास करें।
तालिका नाम से विभाजित व्यक्ति आईडी
जहां कल्पिफिकेशन नहीं है ('2');

3

बाहरी प्रश्न में आपकी एन: एन तालिका के बजाय Person तालिका का उपयोग करके आप distinct छोड़ सकते हैं और उप-क्वेरी में एंटी सेमी में शामिल होने से क्लस्टरर्ड इंडेक्स पर बेहतर प्रदर्शन होगा। (PersonIDPerson तालिका में पीके है)

SELECT PersonID 
FROM tblPerson 
WHERE NOT EXISTS 
    (
     SELECT NULL 
     FROM tblPersonKvalifikation 
     WHERE KvalifikationId = 2 AND 
       tblPerson.PersonID = tblPersonKvalifikation.PersonID 
    ) 
संबंधित मुद्दे