Requête SQL pour find des faux négatifs par rapport aux données ou à une entité

Supposons que j'ai deux ID différents atsortingbués pour le même logging. Par exemple

 RecordID |  ID1 |  ID2
 --------------------
 1 |  X |  UNE
 2 |  X |  B
 3 |  Y |  C
 4 |  Y |  C
 5 |  Y |  ré
 6 |  Z |  E
 7 |  Z |  E

Maintenant, je veux get les loggings où ID1 est assigné à la même valeur où ID2 est assigné à une valeur différente.

Par exemple, je veux get:

 1, X, A 2, X, B 

Ici ID1 lui a assigné X où ID2 lui a assigné A et B, deux valeurs différentes.

Est-il possible d'écrire une requête dans SQL ou SQL Server qui va returnner ces loggings?

Vous devez utiliser une sous-requête dans laquelle, pour chaque ligne, vous parcourez la table et voyez si d'autres lignes correspondent à certains critères.

pseudo sql:

 select t1.id, t1.variable, t1.value from table t1 where exists ( select 1 from t2 where t2.id != t1.id and t2.variable == t1.variable and t2.value != t1.value) 

En supposant que je comprends vos besoins, je pense que tout ce dont vous avez besoin est un INNER JOIN :

 SELECT DISTINCT T.* FROM YourTable T JOIN YourTable T2 ON T.ID1 = T2.ID1 AND T.ID2 <> T2.ID2 

Et voici le violon SQL .

S'il vous plaît noter, dans cet exemple, il returnne toutes les lignes de X et Y. X en raison de A et B; Y à cause de C et D. Est-ce correct?

Bonne chance.

Je pense que vous cherchez ceci:

 SELECT RecordID, ID1, ID2 FROM yourtable WHERE ID1 IN (SELECT ID1 FROM yourtable GROUP BY ID1 HAVING COUNT(DISTINCT ID2)>1); 

Voir le violon ici .

Si c'est SQL Server 2005+:

 WITH minmax AS ( SELECT *, minID2 = MIN(ID2) OVER (PARTITION BY ID1), maxID2 = MAX(ID2) OVER (PARTITION BY ID1) FROM atable ) SELECT RecordID, ID1, ID2 FROM minmax WHERE minID2 <> maxID2 ; 

Dans le minmax , deux autres colonnes sont ajoutées qui contiennent les ID2 minimum et maximum pour chaque groupe de lignes ayant le même ID1 . La requête principale renvoie uniquement les lignes où l' ID2 minimum correspondant ne correspond pas à l' ID2 maximum.