2017-10-13 4 views
8

J'ai quelques exemples de données comme:Logic pour vérifier si ids exactes sont présents dans un groupe dans SQL Server

INSERT INTO mytable ([ID], [FK_ID], [TYPE_ID]) 
VALUES 
    (1, 10, 1), 
    (2, 11, 1), (3, 11, 2),  
    (4, 12, 1), (5, 12, 2), (6, 12, 3), 
    (7, 14, 2), (8, 14, 3) 

Maintenant, ici, je suis en train de vérifier si dans chaque groupe par FK_ID nous avons correspondance exacte TYPE_ID les valeurs 1 & 2.

Ainsi, le résultat attendu est comme:

  1. (1, 10, 1) cela devrait échouer
    • Comme dans le groupe FK_ID = 10 nous avons un seul enregistrement
  2. (2, 11, 1), (3, 11, 2) cela devrait passer
    • Comme dans le groupe FK_ID = 11 nous avons deux enregistrements.
    • Et les deux TYPE_ID correspondent 1 & 2 valeurs.
  3. (4, 12, 1), (5, 12, 2), (6, 12, 3) cela devrait aussi échouer
    • Comme nous l'avons 3 dossiers ici.
  4. (7, 14, 2), (8, 14, 3) cela devrait aussi échouer
    • Même si nous avons deux dossiers précis, il doit échouer comme TYPE_ID ici ne sont pas correspondant à 1 & 2 valeurs.

Voici ma tentative:

select * 
from mytable t1 
where exists (select count(t2.TYPE_ID) 
       from mytable t2 
       where t2.FK_ID = t1.FK_ID 
       and t2.TYPE_ID in (1, 2) 
       group by t2.FK_ID 
       having count(t2.TYPE_ID) = 2); 

Ce ne fonctionne pas comme prévu, car il passe aussi pour FK_ID = 12 qui a trois dossiers.

Démo: SQL Fiddle

Répondre

2

Il y a probablement plusieurs façons de le faire. On pourrait être:

SELECT FK_ID 
FROM mytable 
GROUP BY FK_ID 
HAVING COUNT(*) = 2 
AND MIN(TYPE_ID) = 1 
AND MAX(TYPE_ID) = 2 
+1

Merci pour la solution. Ça a marché. – CodeNewbie

+0

@CodeNewbie La meilleure façon de remercier quelqu'un dans Stackoverflow est de l'accepter comme votre réponse – Valli

+0

Comment pouvons-nous faire cela? Je ne sais pas comment le faire. – CodeNewbie

1

Nous pouvons ajouter min et max au groupe par requête

select t1.* from mytable t1, 
(select fk_id, count(*) As cnt from mytable 

       Group by fk_id 
       Having count(*) = 2 
       AND max(type_id)=2 
       ANd min(Type_id) = 1) As t2 
Where t1.fk_id = t2.fk_id 
+1

Merci pour la solution. Ça a marché! – CodeNewbie

0

Une autre façon, mais moins optimale que Nenad de, est d'utiliser SELECT INTO (avec sortie à table temporaire) puis, avec une autre requête, sélectionnez uniquement les lignes ayant les bonnes valeurs TYPE_ID.