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.