Pour compléter ce qui précède, puisque vous n'avez pas mis en résolu
Vous cherchez l'intersection entre
A = l'ensemble des personnes qui ont un chemin "en cours"
et
B = l'ensemble des personnes qui ont un chemin "OK"
Voici différentes façons de trouver cette intersection :
- utiliser une jointure inner explicite avec INNER JOIN
1 2 3 4 5 6
| SELECT Col1, Col2, ..., Coln
FROM ma_table T1
INNER JOIN ma_table T2
ON T2.nom = T1.nom
where T1.status = 'EN COURS'
and T2.status = 'OK' |
- utiliser une jointure inner implicite avec LEFT ou RIGHT (OUTER) JOIN et une restriction sur l'une des colonnes "not null" de la table OUTER.
1 2 3 4 5 6 7
| SELECT Col1, Col2, ..., Coln
FROM ma_table T1
LEFT JOIN ma_table T2
ON T2.nom = T1.nom
where T1.status = 'EN COURS'
and T2.status = 'OK'
and T2.Col1 is not null |
Cette deuxième méthode n'en est pas vraiment une, c'est plutôt un piège dans lequel tombent fréquemment ceux qui n'ont pas bien compris le principe d'une jointure externe
- verifier l'existence de chaque élément de A dans B en utilisant une sous-requête corrélée avec EXISTS
1 2 3 4 5 6 7 8
| SELECT Col1, Col2, ..., Coln
FROM ma_table T1
where T1.status = 'EN COURS'
and exists
(select 1
from ma_table T2
where T2.nom = T1.nom
and T2.status = 'OK') |
- vérifier l'existence de chaque élément de A dans B en utilisant une sous-requête corrélée avec IN
1 2 3 4 5 6 7
| SELECT Col1, Col2, ..., Coln
FROM ma_table T1
where T1.status = 'EN COURS'
and T1.nom in
(select T2.nom
from ma_table T2
where T2.status = 'OK') |
- dans certains cas on peut également utiliser INTERSECT, mais ce n'est pas adapté ici : vous avez besoin de récupérer le chemin qui est différent dans les deux ensembles
D'autres solutions sont possibles : on peut faire mumuse avec EXCEPTpar exemple, mais dans un but purement didactique (ensemble de toutes les personnes sauf celles qui n'ont pas de OK ou qui n'ont pas de "en cours" )
Partager