On dirait que vous voulez un anti-jointure , c'est-à-dire que vous devez d'abord établir quels ID d'utilisateur ont IsFinal = 1
, puis utilisez cet ensemble de résultats pour renvoyer tous les ID utilisateur pas dans cette liste.
Il existe différentes manières d'implémenter un anti-jointure.
-
NOT IN
:SELECT * FROM atable WHERE UserID NOT IN ( SELECT UserID FROM atable WHERE IsFinal = 1 );
-
NOT EXISTS
:SELECT * FROM atable t1 WHERE NOT EXISTS ( SELECT * FROM atable t2 WHERE t1.UserID = t2.UserID AND t2.IsFinal = 1 );
-
LEFT JOIN
+WHERE IS NULL
:a)
SELECT * FROM atable t1 LEFT JOIN ( SELECT * FROM atable WHERE IsFinal = 1 ) t2 ON t1.UserID = t2.UserID WHERE t2.UserID IS NULL;
b)
SELECT * FROM atable t1 LEFT JOIN atable t2 ON t1.UserID = t2.UserID AND t2.IsFinal = 1 WHERE t2.UserID IS NULL;
Il se peut qu'ils soient aussi performants dans votre base de données, mais il peut quand même être judicieux de tester chacun d'entre eux pour au moins éviter de se retrouver avec un moins performant que les autres.