Sembra che tu voglia un anti-join , ovvero devi prima stabilire quali ID utente hanno IsFinal = 1
, quindi utilizza quel set di risultati per restituire tutti gli ID utente non in quell'elenco.
Esistono vari modi per implementare un'anti-unione.
-
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;
Può succedere che siano ugualmente efficienti nel tuo database, ma potrebbe comunque essere una buona idea testarli almeno per evitare di trovarne uno con prestazioni peggiori degli altri.