2017-06-29 1 views
0

J'ai une table comme celle-ci où je dois filtrer sur la clé et récupérer la liste des clés.comment récupérer une liste incluant et excluant une clé particulière?

id key 
1 1 
1 2 
1 3 
1 4 
2 1 
2 3 
3 1 
3 4 
4 1 
4 4 

sortie souhaitée:

id key 
2 1 
2 3 
3 1 
3 4 

Ici, je veux obtenir une liste des id i.e. (2,3) dans laquelle la clé 1 est présent et la clé 2 est manquante.

+0

Veuillez clarifier "où 1 est là et 2 n'est pas présent." Selon votre section "Sortie souhaitée", j'écrirais une clause WHERE telle que "WHERE id> 1 AND id <4", mais je pense que cela pourrait ne pas résoudre tous vos cas – RemedialBear

+0

@ChirayuChamoli. . . id = 3 n'a pas de clé = 1. –

Répondre

1

Ceci répond à la question "Je veux obtenir une liste d'ID dans laquelle la clé 1 est présente et la clé 2 manquante".

Vous pouvez utiliser exists et not exists:

select t.* 
from t 
where exists (select 1 from t t2 where t2.id = t.id and t2.key = 1) and 
     not exists (select 1 from t t2 where t2.id = t.id and t2.key = 2); 

Si vous voulez juste ids, je préfère l'agrégation et having:

select id 
from t 
group by id 
having sum(case when key = 1 then 1 else 0 end) > 0 and 
     sum(case when key = 2 then 1 else 0 end) = 0; 
+0

cela fonctionne très bien, il me donne un identifiant distinct mais quand je les compte je reçois tous les 1. une idée? aussi une petite explication serait géniale. –

+0

Utilisez-vous 'sum()' ou 'count()'? –

+0

J'ai essayé avec le compte puis son me donnant tous les 1 pour l'ID. –

0

supposons que votre nom de la table 'testing', alors que selon votre sortie mentionnée la requête sql sera

SELECT * DE testing O WH key! = 2 et id dans (2,3)