Parece que você quer um anti-join , ou seja, primeiro você precisa estabelecer quais IDs de usuário têm
IsFinal = 1
, use esse conjunto de resultados para retornar todos os IDs de usuário não nessa lista. Existem várias maneiras de implementar um anti-join.
-
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;
Pode acontecer que eles sejam igualmente eficientes em seu banco de dados, mas ainda pode ser uma boa ideia testar cada um deles para pelo menos evitar acabar com um que tenha um desempenho pior que os outros.