2011-06-13 7 views
3

J'ai une table avec les données suivantes:SQL- récupérer ID distinct

ID NAME ATTRIBUTE CODE 
============================= 
1  XX   MM  GC 
1  XX   ST  GC 
2  ZZ   LL  GC 
2  ZZ   ST  GC 
3  AA   MM  PC 

J'ai besoin du ID, le nom de la table qui contient soit MM attribut ou GC code, mais pas les deux. Comme la requête devrait récupérer les numéros ID seulement 2 et 3 mais pas 1.

Comment faire cela?

Répondre

0

Essayez ceci:

select distinct ID 
from TableName 
where (Attribute = 'MM' or Code = 'GC') 
    and not (Attribute = 'MM' AND Code = 'GC') 
+2

Cela ne retournera-t-il pas 1, en raison de la deuxième ligne de données? – AakashM

+0

@AakashM: Oui, je pense que vous avez raison. Je n'ai pas remarqué ça. Je pense que la réponse de Barry est meilleure. – MJB

0

Essayez ceci:

SELECT ID, NAME 
    FROM <YOUR-TABLE-NAME> 
WHERE 
(ATTRIBUTE = 'MM' AND CODE <> 'GC') OR 
(ATTRIBUTE <> 'MM' AND CODE = 'GC') ; 
0

sélectionnez Id distincte, Nom de TBL? où (attribut = 'MM' ou code = 'GC') et non (attribut = 'MM' et code = 'GC')

2
Select Id, Name 

From #t 
Where (Attribute = 'MM' Or Code = 'GC') 
And Id Not In (Select Id From #t 
       Where (Attribute = 'MM' And Code = 'GC')) 
1
select distinct T1.ID, 
       T1.NAME 
from T as T1 
where (T1.ATTRIBUTE = 'MM' or T1.CODE = 'GC') and 
     not exists (select * 
        from T as T2 
        where T1.ID = T2.ID and 
         T2.Attribute = 'MM' and 
         T2.CODE = 'GC') 

Résultat:

ID NAME 
2 ZZ 
3 AA 
0
(
    SELECT ID, NAME FROM TableName WHERE CODE = 'GC' 
    EXCEPT 
    SELECT ID, NAME FROM TableName WHERE ATTRIBUTE = 'MM' 
) 
UNION 
(
    SELECT ID, NAME FROM TableName WHERE ATTRIBUTE = 'MM' 
    EXCEPT 
    SELECT ID, NAME FROM TableName WHERE CODE = 'GC' 
)