Parece que quieres un anti-join , es decir, primero debe establecer qué ID de usuario tienen IsFinal = 1
, luego use ese conjunto de resultados para devolver todos los ID de usuario no en esa lista.
Hay varias formas de implementar una anti-unión.
-
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;
Puede suceder que sean igualmente eficientes en su base de datos, pero aun así puede ser una buena idea probar cada uno de ellos para al menos evitar terminar con uno que funciona peor que los demás.